使用JavaRestClient查询文档排序、分页、高亮

news2024/11/25 4:34:01

可以参考着“利用JavaRestClient实现文档的CRUD(从mysql数据库转移到es)”来看

http://t.csdn.cn/SP5nx

1、解析响应的方法

   private void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条数据");
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化
            //HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //System.out.println("hotelDoc = " + hotelDoc);
            System.out.println(json);
        }
    }

2、无条件查找

package cn.itcast.hotel;

import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import cn.itcast.hotel.utils.HotelConstants;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 酒店查询测试
 *
 * @author ning
 * @since 2022/12/5 22:45
 */

@Slf4j
@SpringBootTest
public class HotelSearchTest {

    @Autowired
    private IHotelService hotelService;

    @Test
    void testMatchAll() throws Exception {
        //初始化RestHighLevelClient:
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(HttpHost.create("http://192.168.177.132:9200"))
        );
        //创建请求
        //hotel 是查询的文档名
        SearchRequest request = new SearchRequest("hotel");
        //设置参数
        //QueryBuilders 工具类
        //matchAllQuery() 无条件查询
        request.source()
                .query(QueryBuilders.matchAllQuery());
        //执行请求
        //第一个参数:创建的请求,第二个参数:是否还有其他的选项,一般选DEFAULT
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析响应
        handleResponse(response);
    }

    private void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条数据");
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = " + hotelDoc);
        }
    }
}

 3、全文检索查询

 单字段全文检索查询:match查询

代码和上边无条件查询基本一致,只是需要把查询条件换一下

//设置参数
        //QueryBuilders 工具类
        request.source()
                .query(
                        //QueryBuilders.matchAllQuery() //无条件查询
                        QueryBuilders.matchQuery("all", "如家")//match查询(单字段全文检索查询)
                );

 

  多字段全文检索查询:multi_match查询

代码和上边无条件查询基本一致,只是需要把查询条件换一下

//设置参数
        //QueryBuilders 工具类
        request.source()
                .query(
                        //QueryBuilders.matchAllQuery() //无条件查询
                        //QueryBuilders.matchQuery("all", "如家")//match查询(单字段全文检索查询)
                        QueryBuilders.multiMatchQuery("如家","name","brand","business")//multi_match查询(多字段全文检索查询)
                );

 

 4、精确查询

 精确查询主要是两者:

  • term:词条精确匹配

  • range:范围查询

term:词条精确匹配

        //设置参数
        //QueryBuilders 工具类
        request.source()
                .query(
                        //QueryBuilders.matchAllQuery() //无条件查询
                        //QueryBuilders.matchQuery("all", "如家")//match查询(单字段全文检索查询)
                        //QueryBuilders.multiMatchQuery("如家","name","brand","business")//multi_match查询(多字段全文检索查询)
                        QueryBuilders.termQuery("city","北京")//词条精确匹配
                );

 range:范围查询

        //设置参数
        //QueryBuilders 工具类
        request.source()
                .query(
                        //QueryBuilders.matchAllQuery() //无条件查询
                        //QueryBuilders.matchQuery("all", "如家")//match查询(单字段全文检索查询)
                        //QueryBuilders.multiMatchQuery("如家","name","brand","business")//multi_match查询(多字段全文检索查询)
                        //QueryBuilders.termQuery("city","北京")//term:词条精确匹配
                        QueryBuilders.rangeQuery("price").gte(100).lte(200)//range:范围查询
                );

 

 5、复合查询-boolean query

布尔查询是用must、must_not、filter等方式组合其它查询,代码示例如下:

 

//设置参数
        //QueryBuilders 工具类
        request.source()
                .query(
                        //QueryBuilders.matchAllQuery() //无条件查询
                        //QueryBuilders.matchQuery("all", "如家")//match查询(单字段全文检索查询)
                        //QueryBuilders.multiMatchQuery("如家","name","brand","business")//multi_match查询(多字段全文检索查询)
                        //QueryBuilders.termQuery("city","北京")//term:词条精确匹配
                        //QueryBuilders.rangeQuery("price").gte(100).lte(200)//range:范围查询
                        //boolQuery 布尔查询
                        //其中的子查询包括酒店名字为如家,并且价格在100~200之间的
                        //子查询可以有多个
                        QueryBuilders.boolQuery()
                                .must(QueryBuilders.matchQuery("name", "如家"))
                                .filter(QueryBuilders.rangeQuery("price").gte(100).lte(200))
                );

 

 6、对查询结果进行排序和分页

计算分页的公式:(当前页-1)*每页显示多少条数据,可以得出要从哪一条数据开始查

//排序
        //按照价格升序
        request.source().sort("price", SortOrder.ASC);
        //分页
        //一般由前端返回分页的数据
        int pageNo = 1;//当前页
        int pageSize = 2;//每页显示多少数据
        request.source().from((pageNo-1)*pageSize).size(pageSize);

 

 7、对查询结果高亮显示

高亮的代码与之前代码差异较大,有两点:

  • 查询的DSL:其中除了查询条件,还需要添加高亮条件,同样是与query同级。

  • 结果解析:结果除了要解析_source文档数据,还要解析高亮结果

7.1 高亮请求构建

高亮查询必须使用全文检索查询,并且要有搜索关键字,将来才可以对关键字高亮。

//高亮的请求
        //将酒店名中的如家两个字高亮显示,
        //HighlightBuilder 工具类
        //field 在哪个字段使用高亮显示
        //requireFieldMatch 如果查询的字段和高亮显示使用的字段比一样,需要指定为false
        //建议就算一样,也写上,不会有影响
        request.source().highlighter(
                new HighlightBuilder().field("name").requireFieldMatch(false)
        );

 7.3 高亮结果解析

高亮的结果与查询的文档结果默认是分离的,并不在一起。

因此解析高亮的代码需要额外处理:

 代码解读:

  • 第一步:从结果中获取source。hit.getSourceAsString(),这部分是非高亮结果,json字符串。还需要反序列为HotelDoc对象

  • 第二步:获取高亮结果。hit.getHighlightFields(),返回值是一个Map,key是高亮字段名称,值是HighlightField对象,代表高亮值

  • 第三步:从map中根据高亮字段名称,获取高亮字段值对象HighlightField

  • 第四步:从HighlightField中获取Fragments,并且转为字符串。这部分就是真正的高亮字符串了

  • 第五步:用高亮的结果替换HotelDoc中的非高亮结果

    private void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条数据");
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            System.out.println(json);
             反序列化
            //HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            // 获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)) {
                // 根据字段名获取高亮结果
                HighlightField highlightField = highlightFields.get("name");
                if (highlightField != null && highlightField.getFragments().length > 0) {
                    // 获取高亮值
                    String name = highlightField.getFragments()[0].string();
                     覆盖非高亮结果
                    //hotelDoc.setName(name);
                    System.out.println("高亮处理后的酒店名称:" + name);
                }
            }
        }
    }

 

 

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

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

相关文章

NPM相关

npm包管理工具,安装完node.js,就有npm相关 winR node -v 查看node版本 npm -v 查看npm版本 node.js与npm的关系,只能说node.js里内嵌了npm 功能相关 npm的一些命令 npm conf ls 和 npm config list 都是查看npm配置信息 没有区别 注意:如果你是在当前目录下,比如我这…

头部咨询管理企业的数字化转型之路

咨询管理行业前景与现状&#xff01; 5000字讲解3家头部咨询企业案例&#xff0c;希望能给大家在数字化方面带来一些启发。&#xff08;找客服&#xff0c;可获取咨询行业解决方案详细版&#xff09; 1、数字化转型同样是咨询行业的大命题 新冠疫情发生以来&#xff0c;各行…

Linux重定向原理与系统调用dup2

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、重定向原理①输出重定向②输入重定向二、重定向的系统调用dup2dup2输出重定向三、如何理解一切皆文件四.缓冲区①常见的缓冲区刷新策略②…

【数据结构与算法】B树与B+树

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年12月6日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e;…

电脑e盘不见了怎么恢复?6个步骤找回e盘

电脑e盘不见虽然不是一件常见的事&#xff0c;但是也会有发生的情况。虽然我们还有其他磁盘&#xff0c;平时也会经常忽略e盘。但是e盘也是一个存储磁盘&#xff0c;当电脑e盘不见了&#xff0c;我们也会想要找回来。那么电脑里的e盘丢失了怎么找回呢&#xff1f;下面我们就一起…

QListWidget::itemEntered无效

利用QListWidget进行数据列表的展示&#xff1b; &#xff08;1&#xff09;初始化一个QListWidget&#xff1a; QListWidget* newListWidget new QListWidget(parent); newListWidget->setResizeMode(QListView::Adjust); newListWidget->setViewMode(QListView::Icon…

论文浅尝 | AdaLoGN: 基于推理的机器阅读理解的自适应逻辑图网络

笔记整理&#xff1a;何仕玉珑&#xff0c;天津大学硕士链接&#xff1a;https://arxiv.org/pdf/2203.08992.pdf动机最近的机器阅读理解数据集(如ReClor和LogiQA)需要对文本执行逻辑推理。传统的神经模型不足以进行逻辑推理&#xff0c;而符号推理机不能直接应用于文本推理。为…

【Cross-Direction and Progressive Network:交叉的挖掘信息】

A Cross-Direction and Progressive Network for Pan-Sharpening &#xff08;一种交叉递进的泛锐化网络&#xff09; 本文提出了一种交叉方向渐进&#xff08;cross-direction and progressive&#xff09;网络CPNet来解决全色锐化问题。对信息的充分处理是我们模型的主要特…

实战三十一:基于LightGCN推荐算法的推荐系统详细教程(代码+数据)

推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)构造出用户-项目交互图,协同过滤利用过去的用户-项目交互来实现预测;对相似的用户进行推荐相同喜好的item,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的…

01-go基础-05-数组(声明数组、数组赋值、遍历数组、数组值修改)

文章目录1. 声明数组- 语法- 完整示例2. 数组赋值- 语法- 完整示例- 未赋值的元素仍为默认值3. 数组元素赋值- 语法- 示例4. 数组访问4.1 访问数组中元素4.2 遍历数组5. 数组的修改5.1 修改全部数组元素值5.2 修改单个元素值5.3 数组长度不可以更改1. 声明数组 - 语法 语法 …

刷爆力扣之1 比特与 2 比特字符

刷爆力扣之1 比特与 2 比特字符 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&am…

[附源码]Python计算机毕业设计Django四川景区管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Go语言的IO库那么多纠结该如何选择

在Go语言中I/O操作的内置库有很多种&#xff0c;比如:io库&#xff0c;os库&#xff0c;ioutil库&#xff0c;bytes库&#xff0c;strings库等等。 io.Reader/Writer Go语言里使用io.Reader和io.Writer两个 interface 来抽象I/O&#xff0c;他们的定义如下。 type Reader int…

数据图表软件-FineReport控件简介

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 在帆软报表的具体应用中&#xff0c;经常使用「控件」来实现不同的功能。根据使用方式可将控件分为填报控件和参数控件两大类&#xff0c;填报时使用的控件为填报控件&#xff0c;参数界面使用的控件为参…

认证服务------遇到的问题及解决方案

认证服务的问题及解决方案 问题1&#xff1a;发送验证码 发送验证码要注意的问题 发送验证码要注意的两个问题 1、接口防刷 接口防刷就是因为发送验证码的api接口是可以通过查看页面元素看的到的 上面就可以看到发送验证码的js代码中的请求地址&#xff0c;可以恶意的通过…

【产品设计】APP提升用户注册率的五个方案探讨结论

首先介绍下前置条件&#xff0c;我们在做产品时&#xff0c;出于一开始对行业特征和用户参与度的考虑&#xff0c;所以对注册没有要求&#xff0c;当用户触发需要记录用户行为的功能时才会弹出登陆注册的聚合页面&#xff0c;能够触发弹出的功能有&#xff1a;赞、写点评、回复…

ActiveMQ 笔记(九)Windows部署:单机与集群部署流程

1. 单机版部署 版本关系说明:JDK8环境只能安装5.2及以下的。超过5.2需要JDK9及以上版本环境。 (1)官网下载安装包 activemq.apache.org 选择一个版本进行下载, (2)解压安装包 下载完成之后解压 下载后直接解压缩直接就能用(免安装)。 bin/是服务启动相关的命令文件…

Xylan-PEG-NHS|木聚糖-聚乙二醇-琥珀酰亚胺

Xylan-PEG-NHS|木聚糖-聚乙二醇-琥珀酰亚胺 琥珀酰亚胺又称为丁酰亚胺或丁二酰亚胺&#xff0c;是一种无色针状结晶或具有淡褐色光泽的薄片固体&#xff0c;味甜。易溶于水、醇或氢氧化钠溶液&#xff0c;不溶于醚、氯仿等 中文名称&#xff1a;木聚糖-聚乙二醇-琥珀酰亚胺 …

目标检测 YOLOv5 开源代码项目-环境配置问题

学习视频&#xff1a; 目标检测 YOLOv5 开源代码项目调试与讲解实战【土堆 x 布尔艺数】 项目源码&#xff1a;ultralytics / yolov5 教程&#xff1a;手把手带你调参Yolo v5 (v6.2)&#xff08;推理&#xff09; 遇到的问题&解决的链接&#xff1a; ERROR: Failed buil…

怎样查看对方计算机网络密码,如何查看邻居家的wifi密码?不知道wifi密码怎么蹭网...

如何查看邻居家的wifi密码&#xff1f;不知道wifi密码怎么蹭网&#xff1f;不知道大家有没有遇到这样的问题&#xff1a;手机虽然已经连接到了WiFi&#xff0c;但是却已经忘记了WiFi密码。这时候如果会有一丝担忧在心中&#xff0c;如果下次连接不上&#xff0c;或是有人问你密…