如题,在spring web工程中如何集成 elasticsearch 呢 ?
(参考github项目 : https://github.com/spring-projects/spring-data-elasticsearch)
一、spring.xml 中引入 spring-elasticsearch.xml
<!-- spring-elasticsearch.xml引入 --> <import resource="classpath:spring-elasticsearch.xml"/>
二、TransportClientFactoryBean扩展类及spring-elasticsearch.xml 配置
TransportClientFactoryBean.java 自定义扩展类
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";//可以使用逗号分隔多个节点地址 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 = ",";//逗号 @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; } }
三、 elasticsearch.properties 属性配置
elasticsearch.clusterName=myES elasticsearch.clusterNodes=192.168.1.140:9300
四、pom.xml配置
<!-- es5.5.2 jar --> <dependency> <groupid>org.elasticsearch.client</groupid> <artifactid>transport</artifactid> <version>5.5.2</version> </dependency>
五、如何使用
@Resource 注入TransportClient tranportClient即可
六、(可选)elasticsearch基础CRUD封装类
ElasticSearchBaseDao.java
/** * elasticsearch 底层CRUD封装dao * @author jelly */ @Component public class ElasticSearchBaseDao { @Resource private TransportClient transportClient ; /** * 索引一个对象 * @param index 索引名称 * @param type 索引类型 * @param id 文档id 可为null, put方式需指定文档id,post无须指定id,服务器自动生成 * @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(); } /** * 根据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) ; } /** * 根据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(); } /** * 更新一个对象 * @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(); } /** * 查询所有 * @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 ; } /** * 查询所有分页 * @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 ; } /** * 查询所有 分页排序 * @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 ; } /** * 查询 包含指定列 * @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 ; } /** * 查询 排除指定列 * @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 ; } /** * 关键字搜索 * @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!!