SpringBoot整合Elasticsearch7.2.0的实现方法
作者:onlooker 发布时间:2023-11-09 19:22:56
标签:Spring,Boot,Elasticsearch
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://segmentfault.com/a/1190000020179390


猜你喜欢
- 一、前言介绍:1.1 项目摘要 信息内容数据从传统到当今,一直在改变,忽然互联网技术让传统信息内容管理见到划时代的黎明
- 本文实例讲述了C#实现闪动托盘图标效果的方法。分享给大家供大家参考,具体如下:在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件
- 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置。调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载。另一种简单方式是直
- Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~:使
- lambda表达式以及并行流。官方承诺你写出来的代码更运行得更快。流会自动通过Fork/Join池并行地执行。我听过一些关于Java 8的主
- Java基础 Servlet * 详解 1 概念:Servlet * ,用来监听web容器的一些对象状态的变化,主要是Servle
- 如果想你写的程序随系统开机一起启动的话,那么你可以照下面这个方法来做。 RunWhenStart(false, Applicati
- 1.下载JRebel and XRebel for Intellij插件2. 激活请查看这个文章http://www.cicoding.cn
- 本文实例讲述了C#读取或设置ScrollLock状态的方法。分享给大家供大家参考。具体如下:C#读取或者设置ScrollLock状态,允许滚
- 问题现象今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析数据格式:"[1677660600000, 167766
- IDEA maven没有dependenciesIDEA导入新项目没有dependencies跟plugins如图:解决办法网上方法很多,重
- 目录二维码生成原理(即工作原理)效果图如下:前提:源码如下:总结二维码生成原理(即工作原理)二维码官方叫版本Version。Version
- null与voidnull值用来表示数据类型未被赋予任何值,它是一种引用类型;void表示没有类型,或者说是没有任何值。null与void的
- 一、注册流程单nacos节点流程图如下:流程图可以知,Nacos注册流程包括客户端的服务注册、服务实例列表拉取、定时心跳任务;以及服务端的定
- ListBox控件的使用: 1)控件属性 Items SelectedItems SelectioModes 2)数据绑定 DataSour
- 一、创建资源文件可以将字符串、图像或对象数据等资源包含在资源文件中,方便应用程序使用。创建资源文件的方法:1、手动或使用IDE工具自动生成X
- 最近在学习springboot,session这个点一直困扰了我好久,今天把这些天踩的坑分享出来吧,希望能帮助更多的人。一、pom.xml配
- 用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线:由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大
- 今天想说的就是能够在我们操作数据库的时候更简单的更高效的实现,现成的CRUD接口直接调用,方便快捷,不用再写复杂的sql,带吗简单易懂,话不
- cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是