SpingBoot:整合Elasticsearch7.2.0
阿新 • • 發佈:2019-08-25
Spring boot 2.1.X整合Elasticsearch最新版的一處問題
新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支援的Elasticsearch版本是2.X,但Elasticsearch實際上已經發展到7.2.X版本了,為了更好的使用Elasticsearch的新特性,所以棄用了spring-boot-starter-data-elasticsearch依賴,而改為直接使用Spring-data-elasticsearch,以便啟用對新版本支援,目前的版本對應關係如下
Elasticsearch(ES)有兩種連線方式:transport、rest。transport通過TCP方式訪問ES(只支援java),rest方式通過http API 訪問ES(沒有語言限制)。
ES官方建議使用rest方式, transport 在7.0版本中不建議使用,在8.X的版本中廢棄。
引入依賴:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency>
application.yml配置:
elasticsearch:
ip: 192.168.52.132:9200
客戶端連線配置類
package com.dc.elastic.configuration; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Arrays; import java.util.Objects; /** * 描述: 連線客戶端 * * @author leo * @create 2019-08-25 13:22 */ @Configuration public class ElasticsearchRestClient { /** * 超時時間設為5分鐘 */ private static final int TIME_OUT = 5 * 60 * 1000; private static final int ADDRESS_LENGTH = 2; private static final String HTTP_SCHEME = "http"; @Value("${elasticsearch.ip}") String[] ipAddress; @Bean public RestClientBuilder restClientBuilder() { System.err.println(ipAddress); HttpHost[] hosts = Arrays.stream(ipAddress) .map(this::makeHttpHost) .filter(Objects::nonNull) .toArray(HttpHost[]::new); return RestClient.builder(hosts); } @Bean(name = "highLevelClient") public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) { restClientBuilder.setRequestConfigCallback( new RestClientBuilder.RequestConfigCallback() { @Override public RequestConfig.Builder customizeRequestConfig( RequestConfig.Builder requestConfigBuilder) { return requestConfigBuilder.setSocketTimeout(TIME_OUT); } }); //TODO 此處可以進行其它操作 return new RestHighLevelClient(restClientBuilder); } private HttpHost makeHttpHost(String s) { assert StringUtils.isNotEmpty(s); String[] address = s.split(":"); if (address.length == ADDRESS_LENGTH) { String ip = address[0]; int port = Integer.parseInt(address[1]); System.err.println(ip+"+"+port); return new HttpHost(ip, port, HTTP_SCHEME); } else { return null; } } }
測試controller
@RequestMapping("/test")
public void test(@RequestParam String keyword) {
Integer pageIndex = 1;
Integer pageSize = 5;
String indexName = "vw_ods";
Map<String, Object> data = new HashMap<>();
data.put("clearacctname", keyword);
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
SearchRequest searchRequest = new SearchRequest(indexName);
// searchRequest.types(indexName);
queryBuilder(pageIndex, pageSize, data, indexName, searchRequest);
try {
SearchResponse response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
Map<String, Object> map = hit.getSourceAsMap();
map.put("id", hit.getId());
result.add(map);
// 取高亮結果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlight = highlightFields.get("clearacctname");
Text[] fragments = highlight.fragments(); // 多值的欄位會有多個值
String fragmentString = fragments[0].string();
System.out.println("高亮:" + fragmentString);
}
System.out.println("pageIndex:" + pageIndex);
System.out.println("pageSize:" + pageSize);
System.out.println(response.getHits().getTotalHits());
System.out.println(result.size());
for (Map<String, Object> map : result) {
System.out.println(map.get("clearacctname"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void queryBuilder(Integer pageIndex, Integer pageSize, Map<String, Object> query, String indexName,
SearchRequest searchRequest) {
if (query != null && !query.keySet().isEmpty()) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if (pageIndex != null && pageSize != null) {
searchSourceBuilder.size(pageSize);
if (pageIndex <= 0) {
pageIndex = 0;
}
searchSourceBuilder.from((pageIndex - 1) * pageSize);
}
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
query.keySet().forEach(key -> {
boolBuilder.must(QueryBuilders.matchQuery(key, query.get(key)));
});
searchSourceBuilder.query(boolBuilder);
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightTitle =
new HighlightBuilder.Field("title").preTags("<strong>").postTags("</strong>");
highlightTitle.highlighterType("unified");
highlightBuilder.field(highlightTitle);
searchSourceBuilder.highlighter(highlightBuilder);
SearchRequest source = searchRequest.source(searchSourceBuilder);
}
}
官方文件:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.2/java-rest-overview.html
作者:onlooker
來源:三無青年部落格
原文:https://www.35youth.cn/712.html
版權宣告:本文為博主原創文章,轉載請附上博文連結!