ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)
目录
一、基于 JavaRestClient 查询文档
1.1、查询 API 演示
1.1.1、查询基本框架
DSL 请求的对应格式
响应的解析
1.1.2、全文检索查询
1.1.3、精确查询
1.1.4、复合查询
1.1.5、排序和分页
1.1.6、高亮
一、基于 JavaRestClient 查询文档
1.1、查询 API 演示
1.1.1、查询基本框架
接下里通过一个 match_all 查询所有,来演示以下基本的 API.
@Testpublic void testMatchAll() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchAllQuery());//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}/*** 处理响应* @param response*/private void handlerResponse(SearchResponse response) {//1.解析结果SearchHits hits = response.getHits();//获取总条数long total = hits.getTotalHits().value;SearchHit[] hits1 = hits.getHits();for(SearchHit searchHit : hits1) {//获取sourceString json = searchHit.getSourceAsString();System.out.println(json);}}
由上可以看出查询的基本步骤如下:
- 创建 SeaechRequest 对象,指定索引库.
- Request.source() 准备参数,也就是 DSL.
- 通过 QueryBuilders 构建查询条件.
- 传入 Request.source() 的 query() 方法,构建好完整的查询.
- 发送请求,得到结果.
- 解析结果(又外而内,逐层解析).
DSL 请求的对应格式
DSL 语句的构建是通过 HighLevelRestClient 中的 Resource 实现的,其中包含了 查询、排序】分页、高亮等所有功能.
其中 query 表示查询的意思,他的查询条件的是由 QueryBuilders 的工具类提供的,包含了各种查询方法.
响应的解析
响应解析这里,可以在 Kibana 上通过查询结果,对比着看出 API 的调用关系.
1.1.2、全文检索查询
全文检索的 match 和 multi_match 查询和前面演示的 match_all 调用的 API 基本一致,差别就是查询条件,也就是 query 部分(通过 QueryBuilders 构建的条件不一样).
@Testpublic void testMatch() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchQuery("brand", "如家"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
multi_match 也是如此,只是可以支持多个参数查询.
@Testpublic void testMultiMatch() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.multiMatchQuery("如家", "brand", "name"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
运行结果:
1.1.3、精确查询
精确查询常见的有 term 查询 和 range 查询,同样利用 QueryBuilders 实现.
@Testpublic void testTerm() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.termQuery("city", "上海"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
range 查询也是如此.
@Testpublic void testRange() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200)); //链式调用//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
1.1.4、复合查询
布尔查询是一个或多个查询子句的组合. 子查询的组合方式有:
- must:必须匹配的查询条件,类似 “与”.
- should:选择性匹配的查询条件,类似 “或”.
- must_not:必须不匹配,不参与算分,类似 “非”.
- filter:必须匹配,不参与算分
RestAPI 中也提供 BoolQueryBuilder 条件构建方法,用来添加上述条件.
@Testpublic void testBoolQuery() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();booleanQuery.must(QueryBuilders.termQuery("city", "上海"));booleanQuery.filter(QueryBuilders.rangeQuery("price").lte("200"));request.source().query(booleanQuery); //链式调用//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
1.1.5、排序和分页
对于搜索结果的排序和分页与 query 是同级参数,对应 API 如下.
@Testpublic void testFromSize() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchAllQuery());//分页 offset=20 size=10request.source().from(20).size(10);//降序排序request.source().sort("price", SortOrder.DESC);//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
1.1.6、高亮
高亮的 API 包括请求构建 DSL 语句 和 结果解析 两个部分.
请求构建如下:
@Testpublic void testHighLighter() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchQuery("brand", "如家"));request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}
响应解析如下 :
private void handlerResponse(SearchResponse response) throws JsonProcessingException {//1.解析结果SearchHits hits = response.getHits();//获取总条数long total = hits.getTotalHits().value;SearchHit[] hits1 = hits.getHits();for(SearchHit searchHit : hits1) {//获取sourceString json = searchHit.getSourceAsString();System.out.println(json);//2.处理高亮//获取高亮Map<String, HighlightField> highlightFieldMap = searchHit.getHighlightFields();if(!CollectionUtils.isEmpty(highlightFieldMap)) {//获取高亮字段的 valueHighlightField highlightField = highlightFieldMap.get("name");if(highlightField != null) {//取出高亮结果数组中的第一个,这里是酒店名称String name = highlightField.getFragments()[0].string();//对高亮字段的处理(这里打印做演示)System.out.println(name);}}}}
运行后可以看到通过 sout 打印出的“高亮”字段(最后会传输给前端 ,让前端处理高亮. 后端只是标记出了哪些字段需要高亮处理)
相关文章:

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)
目录 一、基于 JavaRestClient 查询文档 1.1、查询 API 演示 1.1.1、查询基本框架 DSL 请求的对应格式 响应的解析 1.1.2、全文检索查询 1.1.3、精确查询 1.1.4、复合查询 1.1.5、排序和分页 1.1.6、高亮 一、基于 JavaRestClient 查询文档 1.1、查询 API 演示 1.1.…...
简易实现通讯录(2.0)
这篇文章是在上期实现的通讯录基础上,增加了自动增容的功能,也解决了一开始通讯录自动开辟一个空间,可能会浪费空间,或者是信息过多无法增容的痛点,由于我们使用的是malloc这类函数来开辟空间,我们也需要来…...
Jasypt 实现自定义加解密
如下文章已经讲解了, Jasypt 是什么,怎么集成 Jasypt,怎么使用 Jasypt。 Jasypt 开源加密库使用教程_jasyptstringencryptor-CSDN博客Jasypt 加密框架概述1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,…...

Leetcode 554. 砖墙
文章目录 题目代码(9.25 首刷自解) 题目 Leetcode 554. 砖墙 代码(9.25 首刷自解) class Solution { public:int leastBricks(vector<vector<int>>& wall) {unordered_map<int, int> mp;int count 0;for…...

Python 内置函数详解 (3) 进制转换
近期在外旅游,本篇是出发前定时发布的,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客 函数列表 abs aiter all …...

SPSS列联表分析
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件可在个人主页—…...

聊聊并发编程——并发容器和阻塞队列
目录 一.ConcurrentHashMap 1.为什么要使用ConcurrentHashMap? 2.ConcurrentHashMap的类图 3.ConcurrentHashMap的结构图 二.阻塞队列 Java中的7个阻塞队列 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue…...
我庄严承诺终生不去承德旅游
虽然人微言轻,但也要尽一份力。 在此,我庄严承诺: 如果承德相关机构不返还那名"灵活就业人员"105.82万元的财产,并进行公开道歉。 我将终生不去承德旅游, 我将终生不买承德出产的任何产品。 我还将劝诫我…...

【python】python实现杨辉三角的三种方法
文章目录 1.杨辉三角介绍:2.方法一:迭代3.方法二:生成器4.方法三:递归 1.杨辉三角介绍: 杨辉三角是一种数学图形,由数字排列成类似三角形的形状。它的每个数值等于它上方两个数值之和。这个三角形的形状可以…...

GitHub 基本操作
最近要发展一下自己的 github 账号了,把以前的项目代码规整规整上传上去,这里总结了一些经验,经过数次实践之后,已解决几乎所有基本操作中的bug,根据下面的操作步骤来,绝对没错了。(若有其他问题…...

Docker和Docker compose的安装使用指南
一,环境准备 Docker运行需要依赖jdk,所以需要先安装一下jdk yum install -y java-1.8.0-openjdk.x86_64 二,Docker安装和验证 1,安装依赖工具 yum install -y yum-utils 2,设置远程仓库 yum-config-manager --add-r…...

51单片机控制电动机正反转,PWM调速,记录转动圈数。
今天的实验需要用到的材料有:51单片机最小系统,4X4的矩阵键盘,DC直流6V-12V带编码器电机,L298N模块,一个led小灯。下面把产品截图展示一下: 单片机就不展示了,都一样,下面是接线图&a…...
JAVA学习(方法的定义和调用)
一、方法的定义和调用 1、关键词:static表示静态方法,如没有返回值使用void,方法名前使用类型,例如int、float等; /*** 测试方法的定义和调用*/public class TestMethod {public static void main(String[] args) {a…...

Linux(CentOS/Ubuntu)——安装nginx
如果确定你的系统是基于CentOS或RHEL,可以使用以下命令: ①、安装库文件 #安装gcc yum install gcc-c#安装PCRE pcre-devel yum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装Open SSL yum install -y openssl openssl-de…...

26962-2011 高频电磁场综合水处理器技术条件
声明 本文是学习GB-T 26962-2011 高频电磁场综合水处理器技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高频电磁场综合水处理器(以下简称处理器)的术语和定义、分类和型号、结构型式、 要求及检验、标志、包装和贮运…...

图扑软件受邀亮相 IOTE 2023 国际物联网展
IOTE 2023 国际物联网展,作为全球物联网领域的盛会,于 9 月 20 日 - 22 日在中国深圳拉开帷幕。本届展会以“IoT构建数字经济底座”为主题,由深圳市物联网产业协会主办,打造当前物联网最新科技大秀。促进物联网与各行业深度融合&a…...

C语言文件操作与管理
一、为什么使用文件 在我们前面练习使用结构体时,写通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了ÿ…...

蓝桥等考Python组别八级005
第一部分:选择题 1、Python L8 (15分) 运行下面程序,输出的结果是( )。 i 1 while i < 4: print(i, end ) i 1 1 2 30 1 2 31 2 3 40 1 2 3 4 正确答案:C 2、Python L8 &#…...

JUnit介绍
JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。 JUnit提供: 断言测试预期结果。 测试功能共享通用的测试数据。 测试套件轻…...

(高阶) Redis 7 第16讲 预热/雪崩/击穿/穿透 缓存篇
面试题 什么是缓存预热/雪崩/击穿/穿透如何做缓存预热如何避免或减少缓存雪崩穿透和击穿的区别?穿透和击穿的解决方案出现缓存不一致时,有哪些修补方案缓存预热 理论 将需要的数据提前加载到缓存中,不需要用户使用的过程中进行数据回写。(比如秒杀活动数据等) 方案 1.…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...