Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch
目录
版本
下载地址
ElasticSearch频繁报503错误
开放 9300 和 9200 两个端口
测试联通性
改动包装类
elasticsearchTemplate
getAllRespRepository
封装elasticsearchService
业务逻辑
版本
首先要对应版本
这是我在官网找到的版本信息
一定要 springboot 和 es 相互对应

下载地址
Past Releases of Elastic Stack Software | Elastic
ElasticSearch频繁报503错误
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址
http.cors.allow-origin: "*"
# 通过为 cluster.initial_master_nodes 参数设置符合主节点条件的节点的 IP 地址来引导启动集群
cluster.initial_master_nodes: ["node-1"]
开放 9300 和 9200 两个端口
关于ElasticSearch的9200和9300端口区别
9200作为Http协议,主要用于外部通讯
9300作为Tcp协议,jar之间就是通过tcp协议通讯
ES集群之间是通过9300进行通讯
测试联通性
linux 上启动服务

使用客户端 es-client


改动包装类
要使其变为 elasticsearch 可以识别的包装类
@Document 类注解中标注其索引(在 elasticsearch 中指的是表名)、
@Id 主键注解
@Field 字段注解中打上标识 表示elasticsearch中可能要进行全文搜索的字段
package work.dduo.ans.model.vo.response;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;import java.util.Date;@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "sentences")
public class GetAllContentResp {@Idprivate Integer id;@Field(type = FieldType.Text) // elasticsearch中可能要进行全文搜索的字段private String content;private Date createTime;@Field(type = FieldType.Text) // elasticsearch中可能要进行全文搜索的字段private String from;private String hot;private String other1;private String other2;private String other3;
}

elasticsearchTemplate
elasticsearchTemplate 是 Java 提供的模版工具类
我们主要用其 search 方法来查询

getAllRespRepository
存储库
类似于 mybatis
我们通过一个类继承 ElasticsearchRepository
来直接调用父类方法中的增删改查方法
package work.dduo.ans.elasticsearch.repository;import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import work.dduo.ans.model.vo.response.GetAllContentResp;// 该接口提供了基本的CRUD操作。
public interface GetAllRespRepository extends ElasticsearchRepository<GetAllContentResp, Integer> {}
注意我们要将包装类和主键类型作为参数传入
封装elasticsearchService
package work.dduo.ans.elasticsearch.service;import org.elasticsearch.index.query.*;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import work.dduo.ans.elasticsearch.repository.GetAllRespRepository;
import work.dduo.ans.model.vo.response.GetAllContentResp;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;@Service
public class ElasticsearchService {@Autowiredprivate ElasticsearchOperations elasticsearchTemplate;@Autowiredprivate GetAllRespRepository getAllRespRepository;/*** 更新数据到elasticsearch** @param getAllResp* @return*/public List<GetAllContentResp> saveProduct(List<GetAllContentResp> getAllResp) {// 把传入的数据 存入elasticsearchreturn (List<GetAllContentResp>) getAllRespRepository.saveAll(getAllResp);}/*** 单字符串全文查询,支持分页和排序 查询包括字符串的所有数据 所有字段** @param queryString 查询字符串* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> fullTextSearch(String queryString, int page, int size) {// 构建查询条件QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(queryString);// 构建搜索查询,设置分页和排序NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC)) // 按照id排序 正序.build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** 某字段按字符串模糊查询 只查询指定字段** @param field 字段名* @param value 查询值* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> fuzzySearchByField(String field, String value, int page, int size) {// 构建模糊查询条件QueryBuilder queryBuilder = QueryBuilders.matchQuery(field, value);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** PhraseMatch 查询(短语匹配)** @param field 字段名* @param phrase 短语* @param slop 允许的最大间隔* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> phraseMatchSearch(String field, String phrase, int slop, int page, int size) {// 构建短语匹配查询条件QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(field, phrase).slop(slop);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** Term 查询(精确查询)** @param field 字段名* @param value 查询值* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> termSearch(String field, Object value, int page, int size) {// 构建精确查询条件QueryBuilder queryBuilder = QueryBuilders.termQuery(field, value);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** multi_match 多个字段匹配某字符串** @param fields 字段数组* @param value 查询值* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> multiMatchSearch(String[] fields, String value, int page, int size) {// 构建多字段匹配查询条件QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(value, fields);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** 完全包含查询** @param field 字段名* @param value 查询值* @param operator 操作符(如 AND、OR)* @param minimumShouldMatch 最少匹配百分比* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> exactMatchSearch(String field, String value, String operator, String minimumShouldMatch, int page, int size) {// 构建匹配查询条件QueryBuilder queryBuilder = QueryBuilders.matchQuery(field, value).operator(Operator.fromString(operator)).minimumShouldMatch(minimumShouldMatch);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** 合并查询(boolQuery) 并集** @param mustField 必须匹配的字段* @param mustValue 必须匹配的值* @param filterField 过滤字段* @param filterValue 过滤值* @param shouldField 可选匹配的字段* @param shouldValues 可选匹配的值数组* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> boolQuerySearch(String mustField, String mustValue, String filterField, Object filterValue, String shouldField, List<Object> shouldValues, int page, int size) {// 构建布尔查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加 must 条件boolQuery.must(QueryBuilders.matchQuery(mustField, mustValue));// 添加 filter 条件boolQuery.filter(QueryBuilders.termQuery(filterField, filterValue));// 添加 should 条件for (Object shouldValue : shouldValues) {boolQuery.should(QueryBuilders.termQuery(shouldField, shouldValue));}// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}/*** 某两个字段按字符串模糊查询 只查询指定字段*** @param field1 第一个字段名* @param value1 第一个查询值* @param field2 第二个字段名* @param value2 第二个查询值* @param page 页码* @param size 每页数量* @return 查询结果列表*/public List<GetAllContentResp> fuzzySearchByTwoFields(String field1, String value1, String field2, String value2, int page, int size) {// 构建第一个字段的模糊查询条件MatchQueryBuilder queryBuilder1 = QueryBuilders.matchQuery(field1, value1);// 构建第二个字段的模糊查询条件MatchQueryBuilder queryBuilder2 = QueryBuilders.matchQuery(field2, value2);// 使用 bool 查询将两个查询条件组合起来 并集
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
// .should(queryBuilder1)
// .should(queryBuilder2);// 使用 bool 查询将两个查询条件组合起来 交集BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(queryBuilder1).must(queryBuilder2);// 构建搜索查询,设置分页NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(PageRequest.of(page, size)).build();// 执行查询SearchHits<GetAllContentResp> searchHits = elasticsearchTemplate.search(searchQuery, GetAllContentResp.class);// 提取查询结果return searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}}
业务逻辑
写入功能
同步 es 的数据
/*** 更新数据到elasticsearch** @param getAllResp* @return*/public List<GetAllContentResp> saveProduct(List<GetAllContentResp> getAllResp) {// 把传入的数据 存入elasticsearchreturn (List<GetAllContentResp>) getAllRespRepository.saveAll(getAllResp);}
搜索功能
客制化搜索
/*** 查询句子数据** @param queryWordsResp* @return*/@Overridepublic List<GetAllContentResp> queryWords(QueryWordsResp queryWordsResp) {// 根据传入的参数是匹配不同的查询类型if (StrUtil.isBlank(queryWordsResp.getContent()) && StrUtil.isBlank(queryWordsResp.getFrom())) {// 传了两个空值进来 走缓存->走数据库return tSentencesMapper.getAll();} else if (StrUtil.isBlank(queryWordsResp.getFrom())) {// 只传了content 走elasticsearch 模糊查询String content = queryWordsResp.getContent();List<GetAllContentResp> results = elasticsearchService.fuzzySearchByField("content", content, 0, 10);return results;} else if (StrUtil.isBlank(queryWordsResp.getContent())) {// 只穿了from 走elasticsearch 模糊查询String from = queryWordsResp.getFrom();// 注意英文名称难以分词 就会出现不能模糊查询的缺点List<GetAllContentResp> results = elasticsearchService.fuzzySearchByField("from", from, 0, 10);return results;} else {// 两个字段都有数值 走elasticsearchList<GetAllContentResp> results = elasticsearchService.fuzzySearchByTwoFields("content", queryWordsResp.getContent(),"from", queryWordsResp.getFrom(),0, 10);return results;}}相关文章:
Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch
目录 版本 下载地址 ElasticSearch频繁报503错误 开放 9300 和 9200 两个端口 测试联通性 改动包装类 elasticsearchTemplate getAllRespRepository 封装elasticsearchService 业务逻辑 版本 首先要对应版本 这是我在官网找到的版本信息 一定要 springboot 和 es 相…...
【矩阵快速幂】P6601 「EZEC-2」机器|普及+
本文涉及知识点 【矩阵快速幂】封装类及测试用例及样例 P6601 「EZEC-2」机器 题目背景 tlx 喜欢科幻小说。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环…...
FPGA助力智能机器人应用
今年开年AI机器人引爆科技圈,都说FPGA是“万能芯”,在AI方向上已经挣扎了几年,仍旧不能“破圈”,那么在机器人方向呢? 个人观点我是不太看好目前FPGA能在机器人方面能“破圈”,但是一切皆有可能,…...
如何在jupyter notebook中使用django框架
(最好以管理员身份进入,否则在安装某些内容时会报错) 一.创建一个名为new_env虚拟环境 输入以下指令创建名为new_env的虚拟环境: conda create -n new_env python3.8 回车,出现以下内容,输入y确认安装,等待安装完毕…...
Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)
文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…...
速卖通vs亚马逊SP-API:接口权限、数据字段与采集成本对比测评
以下是关于速卖通和亚马逊 SP - API 在接口权限、数据字段与采集成本方面的对比测评: 接口权限 速卖通 申请流程:需在速卖通平台注册账号,创建应用后获取 API Key 和 Secret 等凭证。一般要填写企业或个人的相关信息,经过平台审…...
Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)
一、消费流程图 消息在消费出现异常的时候,将一直保留在消息队列,所以你会看到以下奇怪的现象: 消息队列仅有5个消息, 投递速度也非常快,结果却一直无法消费掉。 二、重试策略 重试机制的使用场景:重试机制…...
Java 基础入门代码示例解析
在 Java 编程的学习过程中,理解函数(方法)的使用以及简单系统功能的实现是非常重要的基础。本文将对一系列 Java 代码进行详细解析,这些代码涵盖了菜单驱动的功能选择、数据查询以及简单的 RBAC(基于角色的访问控制&am…...
AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道
文章目录 一、啥是 AI 的 Hallucination?二、啥时候容易出现幻觉?1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现?原理是啥?1. 概率预测的本质2. 训练…...
核心知识——论文详解
引入 在2010年,来自Berkeley的博士生 Matei Zaharia 发表了一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。伴随着这篇论文的,是一个开源系统,也就是 Spark。在之后的几年里&…...
LeetCode hot 100 每日一题(15)——48.旋转图像
这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...
屏幕后处理Post-Processing安装及使用
一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer,只有添加了该组件的相机才会进行相应的后处理,此组件允许您为该后处理层配置抗锯齿…...
探索Halo:不止是博客,更是创作新宇宙
开篇:邂逅 Halo 作为一名热爱写作与分享的博主,拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中,我尝试过不少平台,从 WordPress 到 Hexo ,每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…...
吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…...
开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o
在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…...
数据库:一文掌握 Neo4J 的各种指令(Neo4J指令备忘)
文章目录 入门Neo4J运行 Neo4J 使用进入管理页面 图数据库概念 Neo4j 语法读取查询结构仅写入查询结构读取-写入查询结构 Neo4j 读取数据MATCHWHERERETURNWITHUNION Neo4j 写入数据CREATESETMERGEDELETEREMOVEFOREACH调用子查询调用存储过程导入运算符nullPatternsUSESHOW FUNC…...
Java面试第十三山!《设计模式》
大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢! 一、设计模式入门指南 1. 什么是设计模式? 设计模式是可复用的解决方案模板,用于解决软件开发中常见的架构问题。如同建筑领域的…...
从 @SpringBootApplication 出发,深度剖析 Spring Boot 自动装配原理
在 Spring Boot 的开发旅程中,SpringBootApplication 注解堪称开启便捷开发之门的钥匙。它不仅是一个简单的注解,更是理解 Spring Boot 自动装配原理的重要入口。接下来,我们将以SpringBootApplication 为切入点,深入探究 Spring …...
使用vue3和vue-router实现动态添加和删除cachedViews数组
以下是一个使用 Vue 3 和 Vue Router 实现动态添加和删除 cachedViews 数组的代码示例,该示例结合 keep-alive 组件来动态控制路由组件的缓存。 src/ ├── App.vue ├── router/ │ └── index.js ├── views/ │ ├── Home.vue │ ├── About.v…...
vue 点击放大,图片预览效果
背景: 在使用vue框架element组件的背景下,我们对图片的展示需要点击放大(单张);如果是多张图片,要支持左右滑动查看多张图片(多张)。 单张图片放大,el-image图片组件,或者原生的img标签。 多张图片放大&…...
如何使用Xshell连接Linux虚拟机
在日常开发和运维工作中,远程连接Linux服务器或虚拟机是一项基本技能。Xshell 是一款功能强大的终端模拟器,支持通过 SSH 协议远程连接 Linux 系统。本文将详细介绍如何使用 Xshell 连接 Linux 虚拟机。准备工作 在开始之前,请确保你已经完成…...
笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化
一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划,其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的,但这样表示的话,并不利于我们去做规划,所…...
1 存储过程学习: 使用DMSQL程序的优点
DMSQL程序具有以下优点: 与SQL语言的完美结合 SQL语言已成为数据库的标准语言,DMSQL程序支持所有SQL数据类型和所有SQL函数,同时支持所有DM对象类型。在DMSQL程序中可以使用SELECT、INSERT、DELETE、UPDATE数据操作语句,事务控制…...
NPU上如何使能pytorch图模式
1 Pytorch的compile技术 PyTorch 的 torch.compile 是一个强大的功能,用于优化 PyTorch 模型的性能。它通过将 PyTorch 的动态图转换为静态图,并利用 Just-In-Time(JIT)编译技术,显著提高模型的推理速度和训练效率。 …...
进制转换(c++)
由于进制转换属于基础且比较重要,所以我就写一个博客方便自己复习,过程中如有错误,还请指出。 常用的进制有二进制,八进制,十进制和十六进制。 常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制 我们先…...
2025-03-24 学习记录--C/C++-PTA 习题7-7 字符串替换
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 习题7-7 字符串替换 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换&#…...
为什么TCP需要三次握手?一次不行吗?
文章目录 1. 三次握手的过程2. 为什么需要三次握手?3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手,而不是两次或四次?6. 三次握手中的序列号有什么作用?7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…...
具身系列——NLP工程师切入机器人和具身智能方向
职位高频词汇:VLM调优经验、核心算法(Diffusion、RL、VIT)、pytorch、仿真环境(Isaac Gym、Mujoco、webots) 基于当前具身智能行业发展趋势和岗位需求,以下是为NLP工程师设计的转型路径与策略,…...
SpringBoot2集成Elasticsearch8(使用spring-boot-starter-data-elasticsearch)
写在前面 使用spring-boot-starter-data-elasticsearch集成Elasticsearch8? What? 官方写的不支持啊?让我们来看下官方给出的版本建议。 官方地址: https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.…...
【平台优化】持续调度参数在高负载大集群中的影响
持续调度参数在高负载大集群中的影响 背景介绍2种调度通信方式对集群的影响社区相关的讨论结论 背景介绍 这几年经历了我们大数据的Yarn集群的几次扩容,集群从原先的800多台增加到1300多台到现在的1600多台,在集群规模不断增加的过程中,有遇…...
