SpingBoot:整合Elasticsearch7.2.0
Posted 35youth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpingBoot:整合Elasticsearch7.2.0相关的知识,希望对你有一定的参考价值。
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
版权声明:本文为博主原创文章,转载请附上博文链接!
以上是关于SpingBoot:整合Elasticsearch7.2.0的主要内容,如果未能解决你的问题,请参考以下文章
Spingboot整合Redis,用注解(@Cacheable@CacheEvict@CachePut@Caching)管理缓存
SpringBoot整合shiro系列-SpingBoot是如何将shiroFilter注册到servlet容器中的