SpringBoot整合Elasticsearch7.2.0的实现方法

网友投稿 245 2022-12-29


SpringBoot整合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的版本中废弃。

引入依赖:

org.elasticsearch

elasticsearch

${elasticsearch.version}

org.elasticsearch.client

elasticsearch-rest-client

${elasticsearch.version}

org.elasticsearch.client

elasticsearch-rest-high-level-client

${elasticsearch.version}

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.sNoApypringframework.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 data = new HashMap<>();

data.put("clearacctname", keyword);

List> result = new ArrayList>();

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 map = hit.getSourceAsMap();

map.put("id", hit.getId());

result.add(map);

// 取高亮结果

Map 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 map : result) {

System.out.println(map.get("clearacctname"));

}

} catch (IOException e) {

e.printStackTrace();

}

}

private void queryBuilder(Integer pageIndex, Integer pageSize, Map 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("").postTags("");

highlightTitle.highlighterType("unified");

highlightBuilder.field(highlightTitle);

searchSourceBuilder.highlighter(highlightBuilder);

SearchRequest source = searchRequest.source(searchSourceBuilder);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:系统接口设计规范(接口详细设计)
下一篇:系统接口设计方法论(系统接口设计原则)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~