【ElasticSearch】JavaRestClient实现文档查询、排序、分页、高亮

news2024/11/16 8:31:57

文章目录

  • 1、入门案例
  • 2、全文检索
  • 3、精确查询
  • 4、复合查询-boolean query
  • 5、排序和分页
  • 6、高亮

1、入门案例

先初始化JavaRestClient对象:

@SpringBootTest
public class HotelSearchTest {

    private RestHighLevelClient client;

    @Test
    void testInit() {

        System.out.println(client);
    }

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://10.4.130.220:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}
用match_all来演示基本的API使用:

代码和DSL对应上就是:

在这里插入图片描述

运行结果:

在这里插入图片描述

然后是对结果的解析,对照响应结果:

在这里插入图片描述

示例代码:

@Test
void testMatchAll() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchAllQuery());
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    SearchHit[] hits = searchHits.getHits();
    for (SearchHit hit : hits) {
        String json = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }
}

运行结果:

在这里插入图片描述


总结:

  • 构建DSL是通过HighLevelRestClient中的resource()方法来实现的,这里包含了查询、排序、分页、高亮等操作
    在这里插入图片描述

  • 构建查询条件的核心部分,即查询类型,是用一个名为QueryBuilders的工具类实现的,它包含了各种查询方法
    在这里插入图片描述

  • 查询的基本步骤总结:
    在这里插入图片描述

2、全文检索

和match_all一样,不同的是在QueryBuildes工具类中选的方法不同:

// 单字段查询
QueryBuilders.matchQuery("all", "如家");
// 多字段查询
QueryBuilders.multiMatchQuery("如家", "name", "business");

对比下DSL语句:
在这里插入图片描述

@Test
void testMatch() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all", "如家"));
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);//对响应的处理代码相同,做抽取
}

private void handleResponse(SearchResponse response) {
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    SearchHit[] hits = searchHits.getHits();
    for (SearchHit hit : hits) {
        String json = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }
}

对响应的处理代码相同,这里做个抽取,Ctrl + Alt +M(没用的话Ctrl + Alt + Shift + T,再选Extract Method), 再不行就Settings -> Keymap来打开快捷键设置对话框

在这里插入图片描述

运行:

在这里插入图片描述

3、精确查询

精确查询常见的有term查询和range查询,同样利用QueryBuilders实现

// 词条查询
QueryBuilders.termQuery("city", "杭州"); 
// 范围查询
QueryBuilders.rangeQuery("price").gte(100).lte(150);

与DSL对比:

在这里插入图片描述

@Test
void testRangeQuery() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.rangeQuery("price").gte(100).lte(300));
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);
}

运行:

在这里插入图片描述

4、复合查询-boolean query

// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州")); 
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));

和DSL的对比:

在这里插入图片描述

@Test
void testBooleanQuery() throws IOException {
    //准备Request
    SearchRequest request = new SearchRequest("hotel");
    //准备DSL
    //2.1 准备BooleanQuery
    BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
    //2.2 添加term,用must
    booleanQuery.must(QueryBuilders.termQuery("city", "上海"));
    //2.3 添加range,用filter
    booleanQuery.filter(QueryBuilders.rangeQuery("price").gt(100));  //大于300,lt是小于,less than
    //2.4 测试下mustNot
    booleanQuery.mustNot(QueryBuilders.rangeQuery("price").gte(500)); //大于等于500取反,小于500
    //2.5 玩玩should,或
    booleanQuery.should(QueryBuilders.termQuery("name", "北京宝辰饭店"));
    request.source().query(booleanQuery);
    //3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    //4.调用上面抽取的方法解析响应
    handleResponse(response);
}

运行:

在这里插入图片描述

5、排序和分页

// 查询
request.source().query(QueryBuilders.matchAllQuery());
// 分页
request.source().from(0).size(5);
// 价格排序
request.source().sort("price", SortOrder.ASC);

和DSL的对应关系:

在这里插入图片描述

//pageNum和pageSize从前端Dto获取,
//则起点为(pageNum-1)*pageSize

request.source().from((pageNum - 1)*pageSize).size(pageSize);
@Test
void testPage() throws IOException {
    int pageNum = 2;
    int pageSize = 3;
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("name", "如家"));
    request.source().from((pageNum - 1) * pageSize).size(pageSize);
    request.source().sort("price", SortOrder.ASC);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);
}

运行:

在这里插入图片描述

6、高亮

高亮API包括请求DSL构建和结果解析两部分,DSL构建为:

request.source().highlighter(new HighlightBuilder()        
		.field("name")        
		// 是否需要与查询字段匹配
       .requireFieldMatch(false)
);

在这里插入图片描述
不用默认标签的话也可以,继续链式编程,后面调postTags()等方法即可。

@Test
void testHighLighter() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all","如家"))
            .highlighter(new HighlightBuilder().field("name")
                    .requireFieldMatch(false)
                    .preTags("<strong>")
                    .postTags("</strong")
            );
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);
	handleResponse(response);
}

发现结果并未高亮,因为上面抽取的handleResponse方法是对_source下处理的,这里的数据是原数据,本就不会被修改,因此要继续拿highlight下的数据,即解析高亮结果

在这里插入图片描述

@Test
void testHighLighter() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all","如家"))
            .highlighter(new HighlightBuilder().field("name")
                    .requireFieldMatch(false)
                    .preTags("<strong>")
                    .postTags("</strong")
            );
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);
    SearchHits searchHits = response.getHits();
    SearchHit[] hits = searchHits.getHits();
    for(SearchHit hit : hits){
        String hotelDocString = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(hotelDocString,HotelDoc.class);
        Map<String, HighlightField> highlightFieldMap = hit.getHighlightFields();
        if(! CollectionUtils.isEmpty(highlightFieldMap)){
            HighlightField highlightField = highlightFieldMap.get("name");
            if(highlightField != null){
                String name = highlightField.getFragments()[0].string();
                hotelDoc.setName(name);
                System.out.println(hotelDoc);
            }
        }
    }
}

运行:

在这里插入图片描述

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

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

相关文章

uniapp如何给空包进行签名操作

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 首先安装sdk https://www.oracle.com/java/technologies/downloads/ 正常下一步即可~安装完毕后&#xff0c;进入在sdk根目录执行cmd C:\Program Files\Java\jdk-18.0.1.1\bin生成keystore 例&#xf…

数据结构--线索二叉树找前驱后继

数据结构–线索二叉树找前驱后继 中序线索二叉树找中序后继 在中序线索二叉树中找到指定结点*p的 中序后继 \color{red}中序后继 中序后继next ①若p->rtag 1&#xff0c;则next p->rchild ②若p->rtag 0 中序遍历――左根右 左根(左根右) 左根((左根右)根右) next …

PVT、OCV、工艺偏差、CPPRCRPR、ld漏级电流计算

文章目录 PVT&OCV(local variation)Sources of variation1) Etching2) Oxide Thickness propagation delay、ld、drain currentCPPR&CRPRsetup checkHold check 芯片的delay由两部分影响因素构成 cell delay&#xff1a;library set pvt_cornernet delay: rc tech fil…

电风扇自动温控调速器电路设计

这是一个电风扇自动温控调速器&#xff0c;可根据温度变化情况自动调节电风扇的转速&#xff0c;电路加以调整&#xff0c;也可用于其它电气设备的控制。 一、电路工作原理 电路原理如图 37 所示。 图中 IC 是 555 时基电路&#xff0c;与R2、R3 和 C2 等元件构成多谐振荡器…

前端Vue自定义暂无数据组件nodata 用于页面请求无数据时展示

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

【Cesium 安装+Cesium 加载b3dm】

Cesium 安装 一、安装的方式大致有三种&#xff1a; 1、引入ceisum源码包使用&#xff1b; 2、安装cesium插件&#xff1b; 3、安装Vue-cesium插件 我这里只尝试了第一种和第二种。 引入ceisum源码包使用 可以使用直接下载官方压缩包来引入也可以npm i cesium包&#xff0c;把…

Socket error Event: 32 Error: 10053.

Socket error Event: 32 Error: 10053. 一、报错 &#xff1a;二、问题&#xff1a;三、原因&#xff1a;四、解决方案&#xff1a; 一、报错 &#xff1a; Socket error Event: 32 Error: 10053. 二、问题&#xff1a; xshell连接虚拟机断连 三、原因&#xff1a; 虚拟机…

密码学学习笔记(八):Public-Key Encryption - 公钥加密1

简介 公钥加密也被称为非对称加密。下面是一个例子&#xff1a; Bob生成一个密钥对&#xff0c;发布他的公钥&#x1d443;&#x1d43e;&#x1d435;, 保管密钥&#x1d446;&#x1d43e;&#x1d435; 私有的Alice使用&#x1d443;&#x1d43e;&#x1d435; 加密明文M…

哪个牌子的骨传导蓝牙耳机好?精选当下五款最热门的骨传导耳机

在目前的耳机市场上&#xff0c;大部分耳机的传声原理还是通过空气传声&#xff0c;因为这种传声方式较为符合大家的听觉习惯&#xff0c;但是由于耳机和鼓膜距离太近&#xff0c;如果长时间使用会对鼓膜造成不可逆转的损伤&#xff0c;但骨传导原理的耳机就不会出现这种情况&a…

常用数据分类算法总结记录

本文的主要目的是总结记录日常学习工作中常用到的一些数据分类算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 机器学习领域中常用的分类模型包括以…

【用户调研】用户体验地图:寻找产品突破口

文章目录 什么是用户体验地图为什么需要用户体验地图制作步骤用户体验地图与其他“地图”关系总结 什么是用户体验地图 为什么需要用户体验地图 制作步骤 用户体验地图与其他“地图”关系 总结

前端面试题-HTML、HTTP、web综合问题(三)

26 你做的⻚⾯在哪些流览器测试过&#xff1f;这些浏览器的内核分别是什么? IE : trident 内核Firefox &#xff1a; gecko 内核Safari : webkit 内核Opera :以前是 presto 内核&#xff0c; Opera 现已改⽤Google - Chrome 的 Blink 内核Chrome:Blink (基于 webkit &#xf…

照片模糊怎么变清晰?秒变高清图,三个方法分享给你!

对于摄影爱好者和日常使用照片的人来说&#xff0c;需要高清晰度的图片是很常见的需求。在编写文档、制作展示或者从网络获取图片时&#xff0c;我们经常会遇到模糊的照片&#xff0c;这些照片既不能满足我们的需求&#xff0c;也无法直接使用。那么&#xff0c;如何将模糊的照…

OpenCV图像的仿射变换、旋转和缩放

以下是对代码的逐行解释: // 包含必要的OpenCV头文件和C++库文件 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv;

大数据/AI 行业案例资源介绍分享

大数据行业案例库是泰迪科技在数据挖掘领域探索10余年和高校资深讲师联合经验总结之作&#xff0c;内容涵盖智能电网、移动电信、医疗健康、网络舆情、电子商务、金融保险、交通运输、信息安全、政务民生等诸多行业&#xff0c;特别适合有数据挖掘相关课程教学的高校、研究所和…

【动态规划算法】第七题: 剑指Offer47.礼物的最⼤价值

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法\&#x1f384; 如 果 你…

《世界上最伟大的推销员》 - 经典语录与 AIGC解析

文章大纲 第一卷 全新的我第二卷 爱在今天第三卷 坚持到底第四卷 我是奇迹第五卷 最后一天第六卷 控制情绪第七卷 笑遍世界第八卷 提升价值第九卷 立即行动第十卷 我的祈祷 第一卷 全新的我 经典语录 ★ 世界上没有绝望的处境&#xff0c;只有对处境绝望的人。 ★ 怕苦的人苦一…

Redis 从入门到精通【进阶篇】之Redis事务详解

文章目录 0.前言1.Redis 事务基本流程 1.事务详解1.1. 开始事务1.2. 命令入队1.3. 执行事务1.6. 带 WATCH 的事务1.7. WATCH 命令的实现1.8. WATCH 的触发1.9. 事务的 ACID 性质 2.总结2.1. 在事务和非事务状态下2.2. 小结2.3. 为什么Redis 的事务并不是真正的原子操作2.4. 为什…

TCP连接管理(三次握手,四次挥手)

目录 一、回顾一下TCP包头二、连接的建立——“三次握手”三、连接的建立——“四次挥手”保活计时器 一、回顾一下TCP包头 源端口号&#xff08;Source Port&#xff09;&#xff1a;16 位字段&#xff0c;表示发送方的端口号。 目的端口号&#xff08;Destination Port&…

【机器学习核心总结】什么是决策树

什么是决策树 在游戏中遇到敌人是选择攻击还是逃跑&#xff1f;如果选择攻击&#xff0c;是选择普通的物理攻击还是魔法攻击&#xff1f;为达到目标根据一定的条件进行选择的过程&#xff0c;就是决策树(DT Tree)。 决策树模型非常经典&#xff0c;在机器学习中常被用于分类&…