spring boot 3使用 elasticsearch 提供搜索建议
业务场景
用户输入内容,快速返回建议,示例效果如下

技术选型
- spring boot 3
- elasticsearch server 7.17.4
- spring data elasticsearch 5.0.1
- elasticsearch-java-api 8.5.3
pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>8.5.3</version></dependency>
yml
spring:elasticsearch:uris: http://127.0.0.1:9200data:elasticsearch:repositories:enabled: true
实体类
为了启动时候自己创建相关的index,以及存储搜索内容
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.core.suggest.Completion;/*** 业务搜索建议* @author chunyang.leng* @date 2023-08-21 14:24*/
@Document(indexName = "biz_suggest")
public class BizSuggestDocument {@Idprivate Long id;/*** 标题,可以用于纠错,不参与搜索建议*/@Field(type = FieldType.Text, analyzer = "ik_max_word")private String name;/*** 自动补全标题,搜索建议使用的对象*/@CompletionField(analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private Completion completionName;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Completion getCompletionName() {return completionName;}public void setCompletionName(Completion completionName) {this.completionName = completionName;}
}
搜索结果对象
/*** 搜索建议返回对象* @author chunyang.leng* @date 2023-08-21 19:02*/
public class SuggestVO {/*** 数据id*/private Long id;/*** 内容*/private String text;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}
}
搜索业务层
- 数据导入时候,因为有数据格式要求,必须使用实体类进行写入
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.CompletionSuggester;
import co.elastic.clients.elasticsearch.core.search.Suggester;
import co.elastic.clients.elasticsearch.core.search.Suggestion;
import co.elastic.clients.elasticsearch.core.search.TermSuggester;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** @author chunyang.leng* @date 2023-08-18 18:29*/
@Component
public class SuggestionServiceImpl implements SuggestionService {/*** 搜索建议 key*/private static final String SUGGEST_TAG = "suggest_query";/*** 纠错key*/private static final String TERM_TAG = "suggest_team";@Autowiredprivate ElasticsearchClient elasticsearchClient;/*** 根据 关键词,返回搜索建议** @param match 搜索关键词* @return 搜索建议,10条*/@Overridepublic List<SuggestVO> suggest(String match) throws IOException {SearchRequest completionSuggestSearchRequest = new SearchRequest.Builder().suggest(new Suggester.Builder().suggesters(SUGGEST_TAG, builder -> builder.prefix(match).completion(new CompletionSuggester.Builder().field("completionName").size(10).build())).build()).build();SearchResponse<BizSuggestDocument> completionSuggestSearch = elasticsearchClient.search(completionSuggestSearchRequest, BizSuggestDocument.class);Map<String, List<Suggestion<BizSuggestDocument>>> suggest = completionSuggestSearch.suggest();List<Suggestion<BizSuggestDocument>> suggestions = suggest.get(SUGGEST_TAG);return suggestions.parallelStream().flatMap(x -> x.completion().options().stream().map(o -> {// 原始数据对象,如果有需要,可以对其进行操作BizSuggestDocument source = o.source();String text = o.text();String idValue = o.id();Long id = Long.valueOf(idValue);SuggestVO vo = new SuggestVO();vo.setId(id);vo.setText(text);return vo;})).collect(Collectors.toList());}
}
导入数据
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.suggest.Completion;/*** @author chunyang.leng* @date 2023-08-21 18:09*/
@SpringBootTest
public class EsTest {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void test() {BizSuggestDocument document = new BizSuggestDocument();document.setId(1L);document.setName("飞翔的世界");String[] s = "你的世界1.0,我的世界2.0".split(",");Completion completion = new Completion(s);completion.setWeight(10);document.setCompletionName(completion);elasticsearchTemplate.save(document);BizSuggestDocument document2 = new BizSuggestDocument();document2.setId(2L);document2.setName("路人甲乙丙");String[] s2 = "你的滑板鞋1.0,我的滑板鞋2.0".split(",");Completion completion1 = new Completion(s2);completion1.setWeight(5);document2.setCompletionName(completion1);elasticsearchTemplate.save(document2);}
}
POSTMAN 测试结果如下


相关文章:
spring boot 3使用 elasticsearch 提供搜索建议
业务场景 用户输入内容,快速返回建议,示例效果如下 技术选型 spring boot 3elasticsearch server 7.17.4spring data elasticsearch 5.0.1elasticsearch-java-api 8.5.3 pom.xml <dependency><groupId>org.springframework.boot</gr…...
住宅IP:解锁更快速、稳定的互联网,你准备好了吗?
随着互联网的广泛普及,我们对网络的需求也越来越高。无论是工作、学习还是娱乐,我们都希望能够享受到更快速、稳定的互联网连接。而在实现这一目标的过程中,住宅IP正逐渐崭露头角,成为了一种备受关注的解决方案。那么,…...
支持dolby vision的盒子接支持dolby vision的电视,在adaptive hdr时,播放非dv的hdr视频,输出sdr
支持dolby vision的盒子接支持dolby vision的电视,setting选择adaptive hdr,按照这个配置在播放非dv的hdr视频时,会输出sdr。 看起来是很不合理的,高级的产品播放高级的片源,却输出低级的画质。 想要搞清楚这个问题&am…...
使用ffmpeg将WebM文件转换为MP4文件的简单应用程序
tiktok网上下载的short视频是webm格式的,有些程序无法处理该程序,比如roop程序,本文介绍了如何使用wxPython库创建一个简单的GUI应用程序,用于将WebM文件转换为MP4文件。这个应用程序使用Python编写,通过调用FFmpeg命令…...
Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”
Prompt任务(Prompt Tasks) 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型(Pretrained Model)上得到更好的效果,多用于:Few-Shot,Zero-Shot 等…...
玩转Mysql系列 - 第6篇:select查询基础篇
这是Mysql系列第6篇。 环境:mysql5.7.25,cmd命令中进行演示。 DQL(Data QueryLanguage):数据查询语言,通俗点讲就是从数据库获取数据的,按照DQL的语法给数据库发送一条指令,数据库将按需求返回数据。 DQ…...
【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析
为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道…...
【面试刷题】————STL中的vector是如何实现的?
STL(Standard Template Library)是C标准库中的一部分,它提供了许多常用的数据结构和算法,其中包括了动态数组 vector。 vector std::vector 是一个动态数组,它能够自动调整自己的大小,以适应存储元素的需…...
使用钉钉的扫码会出现多个回调(DTFrameLogin)
官方:地址 标题 出现的问题解决后效果正常使用(按照官网的流程进行使用)自己的理解(路人可忽略该内容!) 出现的问题 1692861955468 解决后效果 1692861665687 正常使用(按照官网的流程进行使用) fn.js 该文件就是钉钉官网的js文件,我下载到了…...
Android | 关于 OOM 的那些事儿
作者:345丶 前言 Android 系统对每个app都会有一个最大的内存限制,如果超出这个限制,就会抛出 OOM,也就是Out Of Memory 。本质上是抛出的一个异常,一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…...
珠玑妙算游戏
珠玑妙算游戏,OJ练习 一、描述二、方法一三、方法二 一、描述 珠玑妙算游戏(the game of master mind)的玩法如下: 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色…...
【rust语言】rust多态实现方式
文章目录 前言一、多态二、rust实现多态trait的静态方式还有一种方式可以通过动态分发,还以上面那段代码,比如dyn关键字 泛型方式枚举方式优点:缺点: 总结 前言 学习rust当中遇到了这个问题,记录一下,不对…...
两年半机场,告诉我如何飞翔
为说明如何坐飞机离港,故此记录一篇。何为离港,顾名思义,离开港湾,那何为港湾,便是机场。 机场,一个你可能经常去,亦或不曾去之地。我想,管你去没去过,先说下怎么去&…...
【动手学深度学习】--21.锚框
锚框 学习视频:锚框【动手学深度学习v2】 官方笔记:锚框 1.锚框 目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(gro…...
C语言学习笔记(完整版)
文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…...
【Unity3D赛车游戏】【四】在Unity中添加阿克曼转向,下压力,质心会让汽车更稳定
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
Python爬虫requests判断请求超时并重新post/get发送请求
在使用Python爬虫中,你可以使用requestsimport requests #Python爬虫requests判断请求超时并重新post发送请求,proxies为代理 def send_request_post(url, data, headers , proxies , max_retries3, timeout5):retries 0while retries < max_retries…...
CSS中如何实现多列布局?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 多列布局(Multi-column Layout)⭐ column-count⭐ column-width⭐ column-gap⭐ column-rule⭐ column-span⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧…...
【C++】string简单实用详解
本片要分享的内容是有关于string的知识,在这之前得介绍一下什么是STL; 目录 1.STL简单介绍 2. string简单介绍 3.string简单使用 3.1.string的定义 3.2.字符串的拼接 3.3.string的遍历 3.3.1.循环遍历 3.3.2.迭代器遍历 4.string的函数构造 1.…...
opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)
在计算机视觉领域,从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB(Oriented FAST and Rotated Brief)特征检测器和描述符。ORB 由 Ethan Rublee 等人开发,结合了…...
OpenClaw 接入 DeepSeek 模型完整配置教程(2026 最新版)
OpenClaw 接入 DeepSeek 模型完整配置教程 一、前置准备 已安装并正常运行 OpenClaw Windows 客户端;OpenClaw 顶部 Gateway 状态保持在线;电脑网络正常,可稳定访问 DeepSeek 开放平台;准备可接收验证码的手机号或微信账号&…...
Rust编程学习.0-安装及环境搭建
目录 前言 一、Rust是什么? 二、Rust安装及环境搭建 1.安装 2.环境搭建 总结 前言 本人借助工作的机会准备好好学习语言编程以及深造嵌入式开发方向,更加系统深入网络,为了不再和之前一样做完再花时间回忆并记录,0帧起手开始…...
基于YOLO+DeepSeek的病虫害检测与环境监测一体化解决方案
智慧农业智能云平台 定位:基于YOLODeepSeek的病虫害检测与环境监测一体化解决方案🌾 核心识别能力 • 支持作物:9种 作物 作物 作物 🌽 玉米 🌾 小麦 🌾 水稻 🍅 番茄 🥔 马铃薯 &am…...
保姆级教程:手把手解决CANoe 17.0在Win11系统上的安装失败问题(附临时文件夹清理方法)
CANoe 17.0在Windows 11系统安装全攻略:从权限配置到环境优化 当汽车电子工程师第一次在Windows 11系统上安装CANoe 17.0时,可能会遇到各种意想不到的障碍。不同于常见的软件安装过程,这款专业工具对系统环境有着更为严格的要求。本文将深入…...
快速解密QQ音乐加密文件:qmc-decoder完整指南
快速解密QQ音乐加密文件:qmc-decoder完整指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的.qmc、.qmc3、.qmcflac格式文件无法在其他播放…...
量子计算中数据驱动的哈密顿修正方法研究
1. 量子门控中的哈密顿修正挑战在量子计算领域,超导transmon比特因其相对较长的相干时间和可扩展性,成为当前最有前景的量子处理器实现方案之一。然而,实际硬件中存在的器件间差异和串扰效应,使得基于理论模型的脉冲设计与真实硬件…...
如何快速实现GitHub界面全面中文化:3分钟安装终极汉化插件
如何快速实现GitHub界面全面中文化:3分钟安装终极汉化插件 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese GitHub中文插件…...
【双AI论文写作】基于claude code、codex双AI协同论文写作撰写与质量校准:从“数据分析→论文初稿→交叉审稿“全流程
AI科研新范式不是让模型替你写论文,而是把论文变成一条可追踪、可审稿、可迭代的科研生产线——数据→写作依据文件→AI初稿→独立AI压测→逐轮提分→投稿包,全程文件可复查、责任在人。 【AI写论文的新范式&论文总体结构】: 科研新范式…...
《流畅的Python》读书笔记03(补充01): 丰富的序列 - Python序列类型核心解析
《流畅的 Python》第 2 章“丰富的序列”系统性地阐述了 Python 序列类型的体系结构、核心操作及其背后的设计哲学。本章内容可归纳为以下四个核心模块: 一、序列类型的分类体系 Python 序列从两个正交维度进行分类,形成了清晰的类型矩阵。 分类维度类…...
从光猫到路由器:DHCP、PPPoE、静态IP三种连接方式的底层原理与实战抓包分析
从光猫到路由器:DHCP、PPPoE、静态IP三种连接方式的底层原理与实战抓包分析 当你面对家庭或企业网络配置时,是否曾疑惑过为什么不同的网络环境会采用截然不同的连接方式?本文将带你深入三种主流上网方式的技术本质,通过Wireshark抓…...
