springboot3.x集成Elasticsearch8.5.3

1. 前言

项目基础为springboot3.0.2,目标是实现Elasticsearch的自定义高亮分页查询,网上提供的方法都是通过继承ElasticsearchRepository实现相关的查询,但是当我查询条件过多且复杂的时候方法命名会非常长,所以暂时弃用,投奔之前用过的spring-boot-starter-data-elasticsearch(主要使用的还是spring-data-elasticsearch5.0.1)。
由于spring-data-elasticsearch5.0.1版本中弃用了ElasticsearchRestTemplate类以及HighlightBuilder,高亮查询就变得异常麻烦。

2. 依赖与参数配置

2.1 pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>3.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>8.11.2</version>
</dependency>

2.2 application.yml

spring:elasticsearch:uris: xxxusername: xxxxpassword: xxxxx

3. 代码实现

@Data
@Document(indexName = "user")
public class User {@Idprivate String id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String name;@Field(type = FieldType.Date)private Date bir;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String content;
}
@Service
@RequiredArgsConstructor
public class EsService {private final ElasticsearchTemplate restTemplate;/*** 初始化es序列*/public boolean initIndex() {IndexOperations indexOperations = restTemplate.indexOps(User.class);if (!indexOperations.exists()) {indexOperations.create();Document mapping = indexOperations.createMapping();indexOperations.putMapping(mapping);return true;}return false;}/*** 初始化es数据** @throws IOException*/public void initEsData() {// 查询获取用户信息restTemplate.save(users);}/*** 分页查询数据** @param keyword* @param pageNo* @param pageSize* @throws IOException*/@Highlight(fields = {@HighlightField(name = "field1"),@.HighlightField(name = "field12"),@HighlightField(name = "field13")},parameters = @HighlightParameters(preTags = "<span style='color:#799ed9'>",postTags = "</span>",fragmentSize = 30,numberOfFragments = 3,requireFieldMatch = false))// 高亮配置信息public PageInfo<User> searchEs(String keyword, Integer pageNo, Integer pageSize) {PageInfo<User> pageInfo = new PageInfo<>();if (pageNo <= 0) {pageNo = 1;}if (pageSize <= 0) {pageSize = 10;}pageInfo.setPageNo(pageNo);pageInfo.setPageSize(pageSize);// 分页数据Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "publishDate");// 条件查询SimpleQueryStringQuery queryBuilder = null;if (StringUtils.isNotBlank(keyword)) {keyword = QueryParser.escape(keyword);keyword = "\"" + keyword + "\"";queryBuilder = new SimpleQueryStringQuery.Builder().fields("field1", "field2").query(keyword).analyzer("ik_max_word").build(); // 查询条件}SimpleQueryStringQuery finalQueryBuilder = queryBuilder;NativeQueryBuilder builder = NativeQuery.builder();if (queryBuilder != null) {builder = builder.withQuery(q -> q.simpleQueryString(finalQueryBuilder));}// 创建一个HighlightQuery实例,指定要高亮的字段Method method = getMethod(EsService.class, "searchEs");if (method != null) {Highlight highlight = method.getAnnotation(Highlight.class);HighlightQuery highlightQuery = new HighlightQuery(org.springframework.data.elasticsearch.core.query.highlight.Highlight.of(highlight),User.class);builder = builder.withHighlightQuery(highlightQuery);}Query query = builder.withPageable(pageable).build();SearchHits<User> search = restTemplate.search(query, User.class);List<SearchHit<User>> searchHits = search.getSearchHits();long totalHits = search.getTotalHits();if (totalHits <= 0) {return pageInfo;}pageInfo.setCount(totalHits);List<User> list = new ArrayList<>();// 设置高亮数据for (SearchHit<User> hit : searchHits) {User content = hit.getContent();JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(content));Map<String, List<String>> highlightFields = hit.getHighlightFields();if (highlightFields.isEmpty()) {list.add(content);continue;}for (Map.Entry<String, List<String>> entry : highlightFields.entrySet()) {StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i < entry.getValue().size(); i++) {if (i > 0) {stringBuffer.append(",");}stringBuffer.append(entry.getValue().get(i));}jsonObject.put(entry.getKey(), stringBuffer.toString());}content = JSONObject.parseObject(jsonObject.toJSONString(), User.class);list.add(content);}pageInfo.setList(list);return pageInfo;}/*** 获取方法** @param clz* @param methodName* @return*/private Method getMethod(Class clz, String methodName) {Method[] methods = clz.getMethods();for (Method method : methods) {if (!method.getName().equals(methodName)) {continue;}return method;}return null;}
}

4. 结束语

本文通过一些非常规手段实现对应的高亮分页查询;仅供参考,如有更好的方式请留言指导,谢谢各位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个视频AI自动抠像 速度快 操作简单 - RobustVideoMattingGU

RVM的GUI版本&#xff1a; 一款基于Robust Video Matting&#xff08;RVM&#xff09;源码的图形用户界面&#xff08;GUI&#xff09;版本&#xff0c;采用先进的pyqt6框架和qdarkstyle风格设计&#xff0c;为视频编辑爱好者和二次创作者打造了一个功能丰富的工具箱。这款软件…

咸鱼的小小实践——大创

最近一段时间没有更新&#xff0c;我们组队去打大创了&#xff0c;很感谢我们的组员的支持和包容&#xff0c;在其中&#xff0c;我们学到了很多东西&#xff0c;在这里进行开源分享&#xff0c;方便沟通&#xff0c;同时&#xff0c;本人也会将大创的心得体会和经验在未来分享…

Python 全栈体系【四阶】(四十二)

第五章 深度学习 九、图像分割 3. 常用模型 3.2 U-Net&#xff08;2015&#xff09; 生物医学分割是图像分割重要的应用领域。U-Net是2015年发表的用于生物医学图像分割的模型&#xff0c;该模型简单、高效、容易理解、容易定制&#xff0c;能在相对较小的数据集上实现学习…

深度剖析进程概念与进程状态

文章目录 1. 前言2. 什么是进程2.1 进程概念2.2 进程描述——PCB 3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用创建子进程 4. 进程状态4.1 普适的操作系统层面4.2 具体Linux操作系统层面 5. 两种特殊的进程5.1 僵尸进程5.2 孤…

Linux中的磁盘分析工具ncdu

2024年5月14日&#xff0c;周二上午 概述 ncdu 是一个基于文本的用户界面磁盘使用情况分析工具。它可以在终端中快速扫描目录&#xff0c;并统计该目录下的文件和文件夹的磁盘使用情况&#xff0c;以交互友好的方式呈现给用户。 安装 在 Debian/Ubuntu 系统下&#xff0c;可…

算法:滑动窗口题目练习

目录 题目一&#xff1a;长度最小的子数组 题目二&#xff1a;无重复字符的最长子串 题目三&#xff1a;最大连续 1 的个数III 题目四&#xff1a;将 x 减到 0 的最小操作数 题目五&#xff1a;水果成篮 题目六&#xff1a;找到字符串中所有字母异位词 题目七&#xff1a…

Git实用命令

存在问题&#xff1a; Git入门经常使用到的命令&#xff1b; 解决方案&#xff1a; 1.本地文件夹创建一个仓库 git init 2.与远程仓库建立连接&#xff0c;git remote add 仓库名 SSH地址 git remote add NewGit gitgithub.com:coberup/NewGit.git3.提交到缓冲区 git add .4…

Java modbus 实现RTU串口作为slave(服务端)读写数据

这里要了解下modbus的RTU和TCP 的几个名称关系&#xff1a; Modbus/RTU&#xff1a;主站 和从站 关系 Modbus/TCP&#xff1a;客户端和服务端关系 关系 主站主动找从站读写数据 客户端主动找服务端读写数据 所以当使用Modbus/TCP时&#xff0c;主站一般作为客户端&#xff…

【教程向】从零开始创建浏览器插件(六)实战篇

【教程向】从零开始创建浏览器插件(六)实战篇 在这篇文章中,我们将详细介绍一个名为“摸鱼King”的Chrome扩展程序的开发思路。这个扩展程序的主要功能是在用户浏览网页时提供便捷的方式来摸鱼看小说。 完整的工程我放在了完整工程,可以下载下来自己试一试。 1. 主要功能…

树莓派发送指令控制FPGA板子上的流水灯程序

文章目录 前言一、树莓派简介二、整体实现步骤三、树莓派设置四、树莓派串口代码五、Verilog代码5.1 串口接收模块5.2 流水灯模块 六、quartus引脚绑定七、 运行效果总结参考 前言 ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验…

Excel常用操作

计算支付成功率 使用公式 ROUND(B2/C2,4)*100&"%" 字符串拼接 将A1-A10的数字用英文逗号拼接 TEXTJOIN(",",TRUE,A1:A10) 将A1-A10中大于5的数字用英文逗号拼接 ARRAYFORMULA(TEXTJOIN(",",TRUE,IF(A1:A10>5,A1:A10,"")…

未来想从事营销策划类的工作,需要怎么学习?

从事营销策划类的工作&#xff0c;提升和学习主要从以下三个方面&#xff1a; 一、营销底层逻辑的搭建 二、营销系统知识的构建 三、大量营销案例的积累 营销入门&#xff0c;其实大多数人一直都在入门的道路上&#xff0c;每个人都是终身学习者。虽然从事营销工作十年多了…

2024年5月中,AITOP100平台活动专区迎来六场AI大赛盛事!

AITOP100平台的活动专区在2024年5月中旬更新的6场AI大赛来了&#xff01; 随着人工智能技术的飞速发展&#xff0c;AI设计已经成为了创新与创意的新领域。2024年5月中旬&#xff0c;由腾讯研究院、剪映、站酷等互联网大厂主办的6场AI设计大赛震撼来袭&#xff0c;为广大AI设计…

【数据分析面试】43.寻找给小费最多的客人(Python:字典用法)

题目&#xff1a; 寻找给小费最多的客人 &#xff08;Python) 给定两个非空列表user_ids和tips&#xff0c;编写一个名为most_tips的函数&#xff0c;用于找到给小费最多的客户。 示例&#xff1a; 输入&#xff1a; user_ids [103, 105, 105, 107, 106, 103, 102, 108, 1…

Top10+java类

OWASPTOP10 文章目录 OWASPTOP10sql注入(面了几家问了几家)xss是什么SSRF文件上传文件包含漏洞命令执行漏洞代码执行漏洞常见的逻辑漏洞越权漏洞java类问题Java 内存马java反序列化的原理:讲一讲weblogic讲一讲shiro反序列化原理讲一讲fastjson反序列化原理:讲一讲log4j RC…

Springboot 文件传输优化

Spring Boot通过MultipartFile接口简化了文件上传的处理。在Spring MVC中&#xff0c;你可以使用RequestParam注解与MultipartFile一起工作来接收上传的文件。Spring Boot默认配置了文件上传的大小限制&#xff0c;但是你可以通过application.properties进行自定义配置。 # 单个…

短剧看剧系统,当前互联网热门项目工具系统模板。

目录 揭秘爆款神器&#xff1a;短剧看剧系统&#xff0c;让你的内容火遍全网&#xff01; 一、短剧看剧系统&#xff1a;一站式解决方案 二、灵活定价&#xff0c;实现收益最大化 三、高效管理&#xff0c;团队协作更轻松 四、数据驱动&#xff0c;精准把握市场动态 五、智…

设置linux终端用户输入空闲一段时间后就自动断开(linux终端超时自动断开)

在 /etc/profile 中加入TMOUT变量即可。 在文件的最后追加以下两行 export TMOUT600 # 600秒内无操作就断开。 readonly TMOUT # 将变量设置为只读&#xff0c;防止用户更改如图

企业计算机服务器中了rmallox勒索病毒怎么解密,rmallox勒索病毒解密工具流程

在当今数字化时代&#xff0c;越来越多的企业依赖计算机服务器进行办公开展业务&#xff0c;计算机服务器犹如企业的心脏&#xff0c;能够为企业存储许多重要的核心信息&#xff0c;帮助企业有效的开展各项工作业务&#xff0c;提高企业的生产效果&#xff0c;但网络是一把双刃…

springMVC基础使用(示例)

maven依赖&#xff08;javax.servlet-api版本与spring-webmvc班恩要匹配不然会报java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRespons&#xff09;&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><arti…