spring boot 2. x 통합 elasticsearch 7. x rest - high - level - client 방식

배경: 최근 es 에 데 이 터 를 액세스 하고 es 도구 클래스 를 만 듭 니 다.
           여러 가지 집적 방식 을 시험 해 보 았 는데 es 7.3 버 전이 너무 새 롭 기 때문에 많은 시행 착 오 를 겪 었 고 간단 한 저장 조회 만 썼 기 때문에 필요 한 것 이 있 으 면 직접 참고 할 수 있다.
           코드 업로드 됨
버 전:
          spring boot  2.1.6.RELEASE
          elasticsearch 7.3.0
          JDK 1.8
 
1. boot 항목 새로 만 들 기
  pom 의존 추가


    
    
        org.elasticsearch.client
        elasticsearch-rest-high-level-client
        7.3.0
    
    
        org.elasticsearch
        elasticsearch
        7.3.0
    

    
        org.elasticsearch.client
        elasticsearch-rest-client
        7.3.0
    

    
    
        com.alibaba
        fastjson
        1.2.58
    

    
    
        org.projectlombok
        lombok
    

    
        org.apache.directory.studio
        org.apache.commons.collections
        3.2.1
    

    
        org.apache.commons
        commons-lang3
        3.8
    

    
        org.springframework.boot
        spring-boot-starter-web
    


2 application. yml 파일 설정
elasticSearch:
  #     ,   ,  
  hosts: 127.0.0.1
  port: 9200
  #      
  schema: http
  client:
    #       
    connectTimeOut: 1000
    #       
    socketTimeOut: 3000
    #          
    connectionRequestTimeOut: 500
    #      
    maxConnectNum: 50
    #        
    maxConnectPerRoute: 50

 
3 es 설정 클래스 작성
package com.example.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: ElasticSearch    
 * @Author: karma
 * @Date: 2019/11/25 3:11   
 */
@Configuration
public class ElasticSearchConfig {

    /**
     *     ,   ,  
     **/
    @Value("${elasticSearch.hosts}")
    private String hosts;

    /**
     *    
     **/
    @Value("${elasticSearch.port}")
    private int port;

    /**
     *      
     **/
    @Value("${elasticSearch.schema}")
    private String schema;

    /**
     *       
     **/
    @Value("${elasticSearch.client.connectTimeOut}")
    private int connectTimeOut;

    /**
     *       
     **/
    @Value("${elasticSearch.client.socketTimeOut}")
    private int socketTimeOut;

    /**
     *          
     **/
    @Value("${elasticSearch.client.connectionRequestTimeOut}")
    private static int connectionRequestTimeOut;

    /**
     *      
     **/
    @Value("${elasticSearch.client.maxConnectNum}")
    private static int maxConnectNum;

    /**
     *         
     **/
    @Value("${elasticSearch.client.maxConnectPerRoute}")
    private static int maxConnectPerRoute;


    private List hostList = new ArrayList<>();

    @PostConstruct
    private  void init(){
        hostList = new ArrayList<>();
        String[] hostArray = hosts.split(",");
        for (String host : hostArray) {
            hostList.add(new HttpHost(host, port, schema));
        }
    }

    @Bean
    public RestHighLevelClient getRestHighLevelClient() {

        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
        //   httpclient      
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeOut);
            requestConfigBuilder.setSocketTimeout(socketTimeOut);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
            return requestConfigBuilder;
        });
        //   httpclient     
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
            return httpClientBuilder;
        });
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }

}

4  ElasticSearchUtils 작성
package com.example.util;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.*;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Description: ElasticSearch    
 * @Author: karma
 * @Date: 2019/11/25 10:34   
 */
@Component
public class ElasticSearchUtils {

    @Resource
    private RestHighLevelClient restHighLevelClient ;

   ============  ======================================

    /**
     * description:        
     * @author karma
     * @param index   
     * @param fieldMap   map  
     * @return java.lang.String
     * @date 2019/11/27 3:47   
     **/
    public String getByMultiFieldNames(String index, Map fieldMap) throws IOException{
        if(StringUtils.isBlank(index) || MapUtils.isEmpty(fieldMap)){
            return null;
        }
        SearchRequest searchRequest = new SearchRequest(index);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //        
        fieldMap.forEach((key, value) ->{
            boolQueryBuilder.must(QueryBuilders.termQuery(key,value));
        });

        sourceBuilder.query(boolQueryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
        return handleSearchResponse2Json(searchResponse);
    }


    /**
     * description:   id   
     * @author karma
     * @param index   
     * @param id (es  id  _id)
     * @return java.lang.String
     * @date 2019/11/25 1:53   
     **/
    public String getByIndexAndId(String index, String id)throws IOException{
        if(StringUtils.isBlank(index) || StringUtils.isBlank(id)){
            return null;
        }

        GetRequest getRequest = new GetRequest(index,id);
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        return getResponse.getSourceAsString();
    }

    /**
     * description:       
     * @author karma
     * @param index   
     * @param pageNum    
     * @param pageSize     
     * @return java.lang.String
     * @date 2019/11/25 1:54   
     **/
    public String getByIndex(String index, int pageNum, int pageSize)throws IOException{
        if(StringUtils.isBlank(index)){
            return null;
        }

        //     
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //   
        if(pageNum >= 0 && pageSize >= 0){
            searchSourceBuilder.from(pageSize*(pageNum - 1));
            searchSourceBuilder.size(pageSize);
        }else {
            //             20   
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(19);
        }

        //     
        MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

        //       
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
        return handleSearchResponse2Json(searchResponse);
    }


    /**
     * description:       
     * @author karma
     * @param index   
     * @param fileName    
     * @param value    
     * @return java.lang.String
     * @date 2019/11/27 4:00   
     **/
    public String getByFieldName(String index, String fileName,String value) throws IOException{

        if(StringUtils.isBlank(index) || StringUtils.isBlank(fileName) || StringUtils.isBlank(value)){
            return null;
        }

        SearchRequest searchRequest = new SearchRequest(index);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        QueryBuilder queryBuilder = QueryBuilders.matchQuery(fileName,value);
        sourceBuilder.query(queryBuilder);

        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
        return handleSearchResponse2Json(searchResponse);
    }

  

    /**
     * description:  SearchResponse         json
     * @author karma
     * @param searchResponse
     * @return java.lang.String
     * @date 2019/11/27 2:33   
     **/
    private String handleSearchResponse2Json(SearchResponse searchResponse){

        SearchHit[] hits = searchResponse.getHits().getHits();

        if(hits.length == 0){
            return null;
        }

        List> dataList = new ArrayList<>(hits.length);
        for(int i=0; i< hits.length; i++){
            dataList.add(hits[i].getSourceAsMap());
        }
        return JSONObject.toJSONString(dataList);
    }

}

좋은 웹페이지 즐겨찾기