spring4整合elasticsearch5

 如题,在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!!




猜你喜欢

转载自blog.csdn.net/jasnet_u/article/details/80220302