当前位置: 首页 > news >正文

SpringBoot封装Elasticsearch搜索引擎实现全文检索

一、前言

注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装

ES就不用过多介绍了,直接上代码:

二、实现步骤:

  • 创建Store类(与ES字段对应,用于接收ES数据)
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;/*** indexName               索引名称 理解为数据库名 限定小写* type                    理解为数据库的表名称* shards                  默认分区数* replicas                每个分区默认的备份数* refreshInterval         刷新间隔* indexStoreType          索引文件存储类型**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = yourIndex, shards = n, replicas = n, refreshInterval = n)
public class Store implements Serializable {/*** 属性,与ES字段对应* 注:@Field注解:* 若Java属性名与ES字段名不同,则根据@Field的name属性匹配ES字段* 若Java属性名与ES字段名完全相同,则不用加该注解或name属性*/@Field(name = "yourESfield")private String yourAttribute;
}
  • Elasticsearch全文检索接口:不分页检索
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;@Slf4j
@Component
public class Elasticsearch{@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 不分页检索** @param yourIndex 索引* @param builder   搜索条件* @param sortField 排序属性* @param sortOrder 排序方式* @param clazz     返回类* @param <T>       泛型* @return 分页表格*/@SuppressWarnings("checkstyle:ParameterNumber")public <T> List<T> searchListByCond(String yourIndex, BoolQueryBuilder builder, String sortField, SortOrder sortOrder, Class<T> clazz) {SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(builder);if (StringUtils.isNotBlank(sortField)) {sourceBuilder.sort(sortField, sortOrder);}SearchRequest request = new SearchRequest(yourIndex);request.source(sourceBuilder);SearchResponse response = null;try {response = restHighLevelClient.search(request, RequestOptions.DEFAULT);} catch (Exception e) {log.error("Search Elasticsearch Error!", e);}if (response == null) {return Collections.emptyList();}return Arrays.stream(response.getHits().getHits()).map(v -> JSON.parseObject(v.getSourceAsString(), clazz)).collect(Collectors.toList());}
}
  • Elasticsearch全文检索接口:分页检索
/*** 分页检索** @param yourIndex 索引* @param builder   搜索条件* @param page      分页参数(自己封装一个分页类,网上很多,easy)* @param sortField 排序属性* @param sortOrder 排序方式* @param clazz     返回类* @param <T>       泛型* @return 分页表格*/@SuppressWarnings("checkstyle:ParameterNumber")public <T> Page<T> searchPageByCond(String yourIndex, BoolQueryBuilder builder, Page<T> page, String sortField, SortOrder sortOrder, Class<T> clazz) {SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(builder);sourceBuilder.from(Math.max(page.getOffset(), 0));sourceBuilder.size(page.getLimit());if (StringUtils.isNotBlank(sortField)) {sourceBuilder.sort(sortField, sortOrder);}SearchRequest request = new SearchRequest(yourIndex);request.source(sourceBuilder);SearchResponse response = null;try {response = restHighLevelClient.search(request, RequestOptions.DEFAULT);} catch (Exception e) {log.error("Search Elasticsearch Error!", e);}if (response == null) {page.setRows(Collections.emptyList());page.setTotal(0);return page;}page.setRows(Arrays.stream(response.getHits().getHits()).map(v -> JSON.parseObject(v.getSourceAsString(), clazz)).collect(Collectors.toList()));page.setTotal((int) response.getHits().getTotalHits().value);return page;}

三、总结

  • 本文实现了Java对Elasticsearch搜索引擎全文检索的封装

  • 传入索引、BoolQueryBuilder查询条件(选传)、排序方式(选传)、Store数据接收类

  • 即可完成对Elasticsearch的全文分页检索、不分页检索

相关文章:

SpringBoot封装Elasticsearch搜索引擎实现全文检索

一、前言 注&#xff1a;本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了&#xff0c;直接上代码&#xff1a; 二、实现步骤&#xff1a; 创建Store类&#xff08;与ES字段对应&#xff0c;用于接收ES数据&#xff09; import com.alibaba.f…...

(C)一些题4

1. 以下叙述中正确的是( )。 A.C程序中的注释只能出现在程序的开始位置和语句的后面 B.C程序书写格式严格&#xff0c;要求行内只能写一个语句 C,C程序书写格式自由&#xff0c;一个语句可以写在多行上 D.用C语言编写的程序只能放在一个程序文件中 2.设有如下程序段 char …...

ChatGPT初体验:注册、API Key获取与ChatAPI调用详解

自从2022年10月&#xff0c;ChatGPT诞生以后&#xff0c;实际上已经改变了很多&#xff01;其火爆程度简直超乎想象&#xff0c;一周的时间用户过百万&#xff0c;两个月的时间用户过亿。 目前ChatGPT4已经把2023年4月以前的人类的知识都学习到了&#xff0c;在软件工程里面&am…...

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…...

Android U 匹配不到APN,无法发起数据建立的问题分析

问题 打开数据开关后&#xff0c;没有data PDN请求发起&#xff0c;因此无法上网。 根据日志确定是没有找到合适的data profile&#xff0c;原因一般有&#xff1a; 1、APN 没有配置 2、APN 类型/网络能力不满足——APN type或bearer 3、APN 配置了但被disable了——APN p…...

如何打造“面向体验”的音视频能力——对话火山引擎王悦

编者按&#xff1a;随着全行业视频化的演进&#xff0c;我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中&#xff0c;视频已经不再只是传递信息的媒介&#xff0c;更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”&#xff0c;火山引擎正在飞速奔跑…...

什么是NoOps

过去几年&#xff0c;自动化一直在推动整个 IT 行业向前发展。通过自动化某些任务&#xff0c;开发团队可以提高其能力&#xff0c;而无需感受到雇用新团队成员的预算压力。自动化还保证了更高的效率&#xff0c;特别是在操作和维护方面。 传统的软件开发工作流程涉及开发团队…...

Unity - Graphic解析

Gpahic 的作用 Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image&#xff0c;Text&#xff0c;都是继承自Graphic。 Graphic的渲染流程 在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…...

哈希思想的应用

目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结&#xff1a; 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构&#xff0c;通过哈希函数把数据和位置进行映射&#xff0c…...

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名&#xff01;高级提示&#xff1a;使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…...

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…...

Jacobi迭代与SOR迭代求解希尔伯特矩阵

给出线性方程组 Hn*x b&#xff0c;其中系数矩阵Hn为希尔伯特矩阵&#xff1a; 假设 x ∗ (1, 1, . . . , 1)T&#xff0c;b Hnx ∗。若取 n 6,8, 10&#xff0c;分别用 Jacobi 迭代法及 SOR迭代&#xff08;ω 1, 1:25,1:5&#xff09;求解&#xff0c;比较计算结果。…...

【云备份】配置加载文件模块

文章目录 配置信息设计配置文件加载cloud.conf配置文件单例模式的使用ReadConfigFile —— 读取配置文件GetInstance —— 创建对象其他函数的实现 具体实现cloud.confconfig.hpp 配置信息设计 使用文件配置加载一些程序运行的关键信息 可以让程序的运行更加灵活 配置信息&am…...

sqlserver写入中文乱码问题

sqlserver写入中文乱码问题解决方案 首先查看sqlserver数据库编码 首先查看sqlserver数据库编码 查询语句&#xff1a;SELECT COLLATIONPROPERTY(Chinese_PRC_Stroke_CI_AI_KS_WS, CodePage)&#xff1b; 对应的编码&#xff1a; 936 简体中文GBK 950 繁体中文BIG5 437 美国/加…...

【亚马逊云】基于EC2以 All-in-One 模式快速部署 KubeSphere 和 Kubernetes

文章目录 1. 云实例配置说明2. SSH连接云实例3. 查看系统版本4. 修改主机名5. 安装依赖项6. 安全组和DNS修改7. 下载KubeKey8. 同时安装Kubesphere和Kubernetes[可选]单独安装Kubernetes[可选]单独安装KubeSphere9. 验证KubeSphere安装结果10. 登录KubeSphere控制台[可选]安装K…...

使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始

使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标&#xff0c;还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…...

嵌入式设备摄像头基础知识

工作原理 摄像头的工作原理是&#xff0c;当光线通过镜头聚焦到图像传感器上时&#xff0c;传感器会将光信号转换为电信号&#xff0c;并将其传输给处理器进行处理。处理器通过算法对图像信号进行增强、去噪、压缩等操作&#xff0c;并将其转换为数字信号输出给计算机或其他设…...

使用Pytorch从零开始构建Normalizing Flow

归一化流 (Normalizing Flow) &#xff08;Rezende & Mohamed&#xff0c;2015&#xff09;学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布&#xff0c;Z是选定的潜在分布。 归一化流是生成模型家族的一部分&#xff0c;其中包括变分自动编…...

一个tomcat中部署的多个war,相当于几个jvm

请直接去看原文 原文链接:一个tomcat有几个jvm-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 前几天向unmi提问&#xff0c;今天他答复了。我觉得答复很清楚&#xff0c;…...

2023年第十六届中国系统架构师大会(SACC2023)-核心PPT资料下载

一、峰会简介 本届大会以“数字转型 架构演进”为主题&#xff0c; 涵盖多个热门领域&#xff0c;如多云多活、海量分布式存储、容器、云成本、AIGC大数据等&#xff0c;同时还关注系统架构在各个行业中的应用&#xff0c;如金融、制造业、互联网、教育等。 与往届相比&#…...

QuantLib避坑指南:从编译安装到多线程优化的5个实战经验

QuantLib工程化实战&#xff1a;从编译优化到高并发设计的5个关键策略 在金融科技领域&#xff0c;QuantLib作为开源的量化金融计算库&#xff0c;已经成为众多机构的核心基础设施。但将QuantLib真正投入生产环境时&#xff0c;开发团队往往会遇到一系列工程化挑战——从复杂的…...

深入芯片布线底层:聊聊ICC II里那些容易被忽略的“小”设置,比如Secondary PG、Via Ladder和天线效应

深入芯片布线底层&#xff1a;ICC II中那些影响性能与良率的隐藏配置 在芯片物理实现的最后阶段&#xff0c;布线工程师往往将注意力集中在时序收敛和DRC修复上&#xff0c;却容易忽略工具中那些看似次要却实际影响深远的配置项。本文将聚焦ICC II布线流程中四个关键但常被低估…...

mPLUG-Owl3-2B多模态交互:本地运行、保护隐私的AI识图方案

mPLUG-Owl3-2B多模态交互&#xff1a;本地运行、保护隐私的AI识图方案 1. 引言&#xff1a;为什么选择本地多模态AI 想象一下&#xff0c;当你看到一张有趣的图片&#xff0c;想了解其中的内容时&#xff0c;不再需要将图片上传到云端服务器&#xff0c;而是直接在本地电脑上…...

Vant4组件避坑指南:Card和Cell样式对齐的那些坑(含解决方案)

Vant4组件深度优化&#xff1a;Card与Cell的样式对齐实战解析 在移动端开发中&#xff0c;Vant4作为主流的Vue组件库&#xff0c;其Card和Cell组件的使用频率极高。但许多开发者在实际项目中都会遇到一个共同的痛点&#xff1a;这两个组件的文本对齐和布局控制问题。本文将深入…...

3步搞定B站音视频分离:BilibiliDown开源工具的实战指南

3步搞定B站音视频分离&#xff1a;BilibiliDown开源工具的实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

无需安装claude code,在快马平台5分钟构建你的第一个代码生成器原型

最近在研究代码生成工具时&#xff0c;发现Claude Code这个新兴项目挺有意思的。它能够根据自然语言描述生成对应的代码&#xff0c;对于快速原型开发特别有帮助。不过在实际尝试时&#xff0c;我发现本地安装配置过程有点麻烦&#xff0c;需要处理各种环境依赖和版本兼容问题。…...

Win11Debloat:一键清理Windows臃肿,让系统重获新生

Win11Debloat&#xff1a;一键清理Windows臃肿&#xff0c;让系统重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

避免自激!AD8367用作AGC放大器时的PCB布局避坑指南与环路稳定性分析

避免自激&#xff01;AD8367用作AGC放大器时的PCB布局避坑指南与环路稳定性分析 在射频与中频电路设计中&#xff0c;AD8367作为一款高性能可变增益放大器(VGA)&#xff0c;因其宽增益范围(45dB)和集成平方律检波器特性&#xff0c;常被用于自动增益控制(AGC)系统。然而&#x…...

拿火吉他温湿度管控专项保养与环境适配指南

温湿度是影响吉他使用寿命与结构稳定性的核心因素&#xff0c;即便拿火吉他采用了 AirSonic 碳纤维一体琴体&#xff0c;大幅降低了环境对琴体的影响&#xff0c;但吉他的指板、琴颈、琴桥等木质部件&#xff0c;依然会对温湿度变化极为敏感&#xff0c;极端温湿度环境会导致琴…...

Multi-Agent在金融投研中的应用:从信息整合到报告生成实战

Multi-Agent在金融投研中的应用:从信息整合到报告生成实战 摘要/引言 开门见山 各位金融界的朋友、AI领域的探索者们,不知道你们有没有注意到一个现象:2023年以来,全球顶尖资管机构(如贝莱德、桥水、摩根大通)的投研团队中,“AI Agent协作小组”的曝光率突然暴涨——…...