For example, how to integrate elasticsearch in spring web project?
(Refer to the github project: https://github.com/spring-projects/spring-data-elasticsearch)
1. Introduce spring-elasticsearch.xml into spring.xml
<!-- spring-elasticsearch.xml import --> <import resource="classpath:spring-elasticsearch.xml"/>
Second, the TransportClientFactoryBean extension class and spring-elasticsearch.xml configuration
TransportClientFactoryBean.java custom extension class
public class TransportClientFactoryBean implements FactoryBean<TransportClient>, InitializingBean, DisposableBean { private static final Logger logger = Logger.getLogger(TransportClientFactoryBean.class); private String clusterNodes = "127.0.0.1:9300";//You can use commas to separate multiple node addresses private String clusterName = "elasticsearch"; private Boolean clientTransportSniff = true; private Boolean clientIgnoreClusterName = Boolean.FALSE; private String clientPingTimeout = "5s"; private String clientNodesSamplerInterval = "5s"; private TransportClient client; private Properties properties; static final String COLON = ":";//分号 static final String COMMA = ",";//Comma @Override public void destroy() throws Exception { try { logger.info("Closing elasticSearch client"); if (client != null) { client.close(); } } catch (final Exception e) { logger.error("Error closing ElasticSearch client: ", e); } } @Override public TransportClient getObject() throws Exception { return client; } @Override public Class<TransportClient> getObjectType() { return TransportClient.class; } @Override public boolean isSingleton() { return false; } @Override public void afterPropertiesSet() throws Exception { buildClient(); } protected void buildClient() throws Exception { client = new PreBuiltTransportClient(settings()); Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing."); for (String clusterNode : StringUtils.split(clusterNodes, COMMA)) { String hostName = StringUtils.substringBeforeLast(clusterNode, COLON); String port = StringUtils.substringAfterLast(clusterNode, COLON); Assert.hasText(hostName, "[Assertion failed] missing host name in 'clusterNodes'"); Assert.hasText(port, "[Assertion failed] missing port in 'clusterNodes'"); logger.info("adding transport node : " + clusterNode); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port))); } client.connectedNodes(); } private Settings settings() { if (properties != null) { return Settings.builder().put(properties).build(); } return Settings.builder() .put("cluster.name", clusterName) .put("client.transport.sniff", clientTransportSniff) .put("client.transport.ignore_cluster_name", clientIgnoreClusterName) .put("client.transport.ping_timeout", clientPingTimeout) .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval) .build(); } public void setClusterNodes(String clusterNodes) { this.clusterNodes = clusterNodes; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public void setClientTransportSniff(Boolean clientTransportSniff) { this.clientTransportSniff = clientTransportSniff; } public String getClientNodesSamplerInterval() { return clientNodesSamplerInterval; } public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) { this.clientNodesSamplerInterval = clientNodesSamplerInterval; } public String getClientPingTimeout() { return clientPingTimeout; } public void setClientPingTimeout(String clientPingTimeout) { this.clientPingTimeout = clientPingTimeout; } public Boolean getClientIgnoreClusterName() { return clientIgnoreClusterName; } public void setClientIgnoreClusterName(Boolean clientIgnoreClusterName) { this.clientIgnoreClusterName = clientIgnoreClusterName; } public void setProperties(Properties properties) { this.properties = properties; } }
Three, elasticsearch.properties property configuration
elasticsearch.clusterName=myES elasticsearch.clusterNodes=192.168.1.140:9300
Fourth, pom.xml configuration
<!-- es5.5.2 jar --> <dependency> <groupid>org.elasticsearch.client</groupid> <artifactid>transport</artifactid> <version>5.5.2</version> </dependency>
5. How to use
@Resource can be injected into TransportClient tranportClient
Six, (optional) elasticsearch basic CRUD packaging class
ElasticSearchBaseDao.java
/** * elasticsearch underlying CRUD encapsulation dao * @author jelly */ @Component public class ElasticSearchBaseDao { @Resource private TransportClient transportClient ; /** * index an object * @param index index name * @param type index type * @param id The document id can be null, the put method needs to specify the document id, the post does not need to specify the id, the server automatically generates * @param o * @return String * @author jelly * */ public <t> String index(String index,String type,String id ,T o){ IndexResponse res=transportClient.prepareIndex(index, type, id) .setSource(JSON.toJSONString(o), XContentType.JSON).get(); return res.toString(); } /** * Query an object by id * @param index * @param type * @param id * @param entityClass * @return T * @author jelly * */ public <t> T findById(String index,String type,String id, Class<t> entityClass){ GetResponse res= transportClient.prepareGet(index, type, id).execute().actionGet(); return JSON.parseObject(res.getSourceAsString(), entityClass) ; } /** * delete an object by id * @param index * @param type * @param id * @return String * @author jelly * */ public String deleteById(String index,String type,String id ){ DeleteResponse res = transportClient.prepareDelete(index, type, id).execute().actionGet(); return res.toString(); } /** * update an object * @param index * @param type * @param id * @param o * @return * @return String * @author jelly * */ public <t> String update(String index,String type, String id , T o){ UpdateResponse res= transportClient.prepareUpdate(index, type, id) .setDoc(JSON.toJSONString(o), XContentType.JSON).get(); return res.toString(); } /** * query all * @param index * @param type * @param entityClass * @return List<t> * @author jelly * */ public <t> List<t> findAll(String index,String type,Class<t> entityClass){ SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()) .execute() .actionGet(); SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } /** * Query all pages * @param index * @param type * @param page * @param entityClass * @return List<t> * @author jelly * */ public <t> List<t> findAllByPage(String index,String type,Page page ,Class<t> entityClass){ SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()) .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .execute() .actionGet(); SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } /** * Query all pagination sorting * @param index * @param type * @param page * @param entityClass * @return * @return List<t> * @author jelly * */ public <t> List<t> findAllByPageSort(String index,String type,Page page,Class<t> entityClass){ SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchResponse sr=null; if(page.getSortOrder().equalsIgnoreCase("asc")){//升序 sr=srb.setQuery(QueryBuilders.matchAllQuery()) .addSort(page.getSortName(), SortOrder.ASC) .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .execute() .actionGet(); }else { sr=srb.setQuery(QueryBuilders.matchAllQuery()) .addSort(page.getSortName(), SortOrder.DESC) //降序 .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .execute() .actionGet(); } SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } /** * The query contains the specified column * @param index * @param type * @param page * @param fields * @param entityClass * @return List<t> * @author jelly * */ public <t> List<t> findIncludeFieldByPage(String index,String type,Page page,String[] fields, Class<t> entityClass){ SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchRequestBuilder builder = srb.setQuery(QueryBuilders.matchAllQuery()) .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .setFetchSource(fields, null); // includes excludes String sortName =page.getSortName(); String sortOrder =page.getSortOrder(); if(sortName!=null && !sortName.equals("")&& sortOrder!=null && !sortOrder.equals("")){ if(sortOrder.equalsIgnoreCase("asc")){ builder.addSort(sortName, SortOrder.ASC); }else{ builder.addSort(sortName, SortOrder.DESC); } } SearchResponse sr = builder.execute().actionGet(); SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } /** * The query excludes the specified column * @param index * @param type * @param page * @param fields * @param entityClass * @return List<t> */ public <t> List<t> findExcludeFieldByPage(String index,String type,Page page,String[] fields, Class<t> entityClass){ SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchRequestBuilder builder = srb.setQuery(QueryBuilders.matchAllQuery()) .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .setFetchSource(null, fields); // includes excludes String sortName =page.getSortName(); String sortOrder =page.getSortOrder(); if(sortName!=null && !sortName.equals("")&& sortOrder!=null && !sortOrder.equals("")){ if(sortOrder.equalsIgnoreCase("asc")){ builder.addSort(sortName, SortOrder.ASC); }else{ builder.addSort(sortName, SortOrder.DESC); } } SearchResponse sr = builder.execute().actionGet(); SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } /** * Keyword search * @param index * @param type * @param page * @param includes * @param field * @param keyword * @param analyzer * @param entityClass * @return List<t> * @author jelly * */ public <t> List<t> searchByFieldKeyword(String index,String type,Page page ,String[] includes, String field,String keyword,String analyzer ,Class<t> entityClass) { SearchRequestBuilder srb=transportClient.prepareSearch(index).setTypes(type); SearchRequestBuilder builder = srb.setQuery(QueryBuilders.matchQuery(field,keyword) .analyzer(analyzer)) .setFrom(page.getStartNum()) .setSize(page.getPageSize()) .setFetchSource(includes, null); // includes excludes SearchResponse sr = builder.execute().actionGet(); SearchHits hits=sr.getHits(); List<t> list =new ArrayList<t>(); for(SearchHit hit:hits){ T o= JSON.parseObject(hit.getSourceAsString(), entityClass); list.add(o); } return list ; } }
ok!!