spring boot 2. x 통합 elasticsearch 7. x rest - high - level - client 방식
여러 가지 집적 방식 을 시험 해 보 았 는데 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.