分布式搜索引擎ES-RestClient查询文档快速入门

RestClient查询文档快速入门

文章目录

    • RestClient查询文档快速入门
      • 1.1、match_all
      • 1.2、全文检索查询
      • 1.3、精确查询
      • 1.4、复合查询-boolean query
      • 1.5、排序和分页
      • 1.6、高亮(解析查询高亮结果)

1.1、match_all

package cn.mannor.hotel;

import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;

import static cn.mannor.hotel.constants.HotelConstants.MAPPING_TEMPLATE;

public class HotelSearchTest {

    private RestHighLevelClient restHighLevelClient; // 高级REST客户端,用于与Elasticsearch进行交互

    @Test
    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest hotelRequest = new SearchRequest("hotel");
        //2.准备DSL
        hotelRequest.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);
        System.out.println(response);
    }


    /**
     * 初始化测试环境,创建并配置RestHighLevelClient实例。
     */
    @BeforeEach
    void setUp() {
        this.restHighLevelClient = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.12.131:9200") // 设置Elasticsearch的地址和端口
        ));
    }

    /**
     * 测试结束后清理资源,关闭RestHighLevelClient实例。
     *
     * @throws IOException 如果关闭客户端时发生IO错误
     */
    @AfterEach
    void tearDown() throws IOException {
        this.restHighLevelClient.close(); // 关闭高级REST客户端,释放资源
    }
}

注:下面的内容我只会放置测试方法。

完整获取:

    @Test
    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest hotelRequest = new SearchRequest("hotel");
        //2.准备DSL
        hotelRequest.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);
        //4.解析响应
        SearchHits searchHits = response.getHits();
        //4.1获取总条数
        long total = searchHits.getTotalHits().value;
        //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(response);
    }

image-20240323104622141

其中,核心API包含所有方法:

  1. hotelRequest.source()
    

image-20240323133454901

  1. QueryBuilders
    

image-20240323133223401

1.2、全文检索查询

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

1.3、精确查询

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

例如:

    @Test
    void testMatch() throws IOException {
        //1.准备Request
        SearchRequest hotelRequest = new SearchRequest("hotel");
        //2.准备DSL
        //2.1词条查询
        hotelRequest.source().query(QueryBuilders.termQuery("hotelName", "酒店"));
        //2.2范围查询
       // hotelRequest.source().query(QueryBuilders.rangeQuery("price").lt(300).gt(1000));
        //3.发送请求
        SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);
        //4.解析响应(方法抽出来了)
        handelResponse(response);
    }

1.4、复合查询-boolean query

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

例:

@Test
void testBooleQuery() throws IOException {
    //1.准备Request
    SearchRequest hotelRequest = new SearchRequest("hotel");
    //2.准备DSL
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    // 添加must条件
    boolQueryBuilder.must(QueryBuilders.matchQuery("city", "上海"));
    // 添加filter条件
    boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lt(250));
    hotelRequest.source().query(boolQueryBuilder);
    //3.发送请求
    SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);
    //4.解析响应(方法抽出来了)
    handelResponse(response);
}

基于上述几种查询,只需要记住核心API:QueryBuilders

1.5、排序和分页

@Test
void testPageAndSort() throws IOException {
    //页码,每页大小
    int page = 1, size = 5;
    //1.准备Request
    SearchRequest hotelRequest = new SearchRequest("hotel");
    //2.准备DSL
    hotelRequest.source().query(QueryBuilders.matchAllQuery());
    //分页from ,size  排序sort
    hotelRequest.source().from((page-1)*size).size(5).sort("price", SortOrder.DESC);
    //3.发送请求
    SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);
    //4.解析响应
    handelResponse(response);

}

image-20240323140751109

1.6、高亮(解析查询高亮结果)

@Test
void testHighlight() throws IOException {
    //1.准备Request
    SearchRequest hotelRequest = new SearchRequest("hotel");
    //2.准备DSL
    hotelRequest.source().query(QueryBuilders.matchQuery("name", "酒店"));
    //分页from ,size  排序sort
    hotelRequest.source().highlighter(new HighlightBuilder()
            .field("name")
            .requireFieldMatch(false));
    //3.发送请求
    SearchResponse response = restHighLevelClient.search(hotelRequest, RequestOptions.DEFAULT);

    
    //高亮解析
    //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);
        //获取高亮结果
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        if (!CollectionUtils.isEmpty(highlightFields)) {
            // 根据字段名获取高亮结果
            HighlightField highlightField = highlightFields.get("name");
            if (highlightField != null) {
                //获取高亮值
                String name = highlightField.getFragments()[0].string();
                //覆盖非高亮结果
                hotelDoc.setName(name);
            }
        }
        System.out.println("hoteldoc:" + hotelDoc);
    }
    System.out.println(response);
}

查询结果:
image-20240323142809826

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言与sqlite3入门

c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…

打造稳健测评体系:亚马逊测评的关键环节解析

亚马逊测评&#xff0c;简而言之&#xff0c;便是通过真实的购买体验&#xff0c;对产品进行的客观评价。这种评价不仅为卖家提供了产品优化的方向&#xff0c;更为消费者提供了决策的依据&#xff0c;使得产品得以在市场中脱颖而出。然而&#xff0c;现今许多卖家选择自主管理…

ideaSSM 财务凭证管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 财务凭证管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

LeetCode540 有序数组中的单一元素

Leetcod540 有序数组中的单一元素 1.题目描述 2.解题思路 同样是二分搜索&#xff0c;利用当i为偶数时候&#xff0c;数组中单独元素左侧的所有i位置与i1位置的数字相同&#xff0c;而单独元素右侧的所有i位置与i1位置元素不同的特性&#xff0c;来进行二分搜索 3.算法思路 …

Java多线程(进阶)

文章目录 目录 文章目录 前言 一 . 常见的锁策略 乐观锁 VS 悲观锁 读写锁 轻量级锁 VS 重量级锁 自旋锁 VS 挂起等待锁 公平锁 VS 非公平锁 可重入锁 VS 不可重入锁 二 . 死锁 死锁的三种典型情况 死锁产生的必要条件 死锁的解决办法 三 . CAS ABA问题 四. S…

Kubernetes(k8s)集群健康检查常用的五种指标

文章目录 1、节点健康指标2、Pod健康指标3、服务健康指标4、网络健康指标5、存储健康指标 1、节点健康指标 节点状态&#xff1a;检查节点是否处于Ready状态&#xff0c;以及是否存在任何异常状态。 资源利用率&#xff1a;监控节点的CPU、内存、磁盘等资源的使用情况&#xf…

“破茧”的快手,何日“成蝶”?

文&#xff5c;小 氿 编&#xff5c;黄小艺 快手&#xff0c;走过了至暗时刻。 3月20日&#xff0c;快手发布2023年第四季度及全年业绩财报。财报显示&#xff0c;2023年快手年营收首次突破千亿元&#xff0c;达到1134.7亿元&#xff0c;同比增长20.5%&#xff1b;而在盈利…

堆排序详解

了解堆的操作和向上&#xff08;下&#xff09;调整算法可以看我的上一篇文章&#xff1a; 详解&#xff08;实现&#xff09;堆的接口函数 文章目录 堆是什么&#xff1f;堆排序的原理如何建堆&#xff1f;怎样建堆更快&#xff1f;1.使用向上调整算法建堆时间复杂度分析 2.使…

CSS的特殊技巧

1.精灵图 使用精灵图核心总结&#xff1a; 1. 精灵图主要针对于小的背景图片使用。 2. 主要借助于背景位置来实现--- background-position 。 3. 一般情况下精灵图都是负值。&#xff08;千万注意网页中的坐标&#xff1a; x轴右边走是正值&#xff0c;左边走是负值&#xf…

抖音小店怎么定类目?分享几个爆单几率大,适合新手的细分类目!

大家好&#xff0c;我是电商糖果 做电商的应该经常听过这么一句话&#xff0c;类目大于一切&#xff01; 好的类目可以让商家减少很多竞争和难题。 糖果做电商有很多年了&#xff0c;我一直认为做店前期最难的定类目&#xff0c;中期是选品&#xff0c;后期是维护店铺。 如…

公司调研 | 空间机械臂GITAI | 日企迁美

最近做的一些公司 / 产品调研没有从技术角度出发&#xff0c;而更关注宏观发展&#xff1a;主营方向、产品介绍、商业化落地情况、融资历程、公司愿景、创始人背景等。部分调研放在知乎上&#xff0c;大部分在飞书私人链接上 最近较关注人形Robot的发展情况&#xff0c;欢迎感兴…

【c++入门】引用,内联函数,auto

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本节我们来到c中一个重要的部分&#xff1a;引用 目录 1.引用的基本概念与用法1.1引用特性1.2使用场景1.3传值、传引用效率比较1.4引用做返回值1.5引用和指针的对…

手撕算法-买卖股票的最佳时机(买卖一次)

描述 分析 只能买卖一次。希望在最低处买&#xff0c;最高处卖。 怎么判断最低处&#xff1f;遍历时存储已遍历的最小值。 怎么判断最高处&#xff1f;遍历时&#xff0c;比较当前位置和最小值的差&#xff0c;取较大的。 代码 class Solution {public int maxProfit(int…

Anaconda安装教程

简介 Anaconda是一个开源的Python发行版&#xff0c;专注于科学计算领域。它支持Linux&#xff0c;Mac&#xff0c;Windows系统&#xff0c;并提供了包管理与环境管理的功能。Anaconda利用工具conda来进行package和environment的管理&#xff0c;并且已经包含了Python和相关的…

SpringCloud从入门到精通速成(二)

文章目录 1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&…

若依用户信息数据导入时自定义密码

若依导入功能: 在使用若依脚手架时,用户信息管理是非常必要的一个部分,而面对大量数据时,使用excel批量导入数据可大大提高效率。若依脚手架也是提供了导入功能,如下图所示: 问题描述 虽然若依脚手架提供了批量导入功能,但其导入的密码总是123456,不仅不安全,而且在…

【Python + Django】静态文件的添加

前言&#xff1a; 前一篇文章我们已经学会了怎么用django写文本页面啦&#xff01;&#xff01;&#xff01; 有一说一&#xff0c;这个静态页面是真的丑。 我们总得用一些花花绿绿的东西把这个丑陋的网站给装饰一下吧&#xff01;&#xff01;&#xff01;&#xff01;&…

手撕算法-接雨水

描述 分析 i位置能积累的雨水量&#xff0c;等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组&#xff1a; leftMaxrightMax 其中 leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度 初始状态&#x…

BEVFormer v2论文阅读

摘要 本文工作 提出了一种具有透视监督&#xff08;perspective supervision&#xff09;的新型鸟瞰(BEV)检测器&#xff0c;该检测器收敛速度更快&#xff0c;更适合现代图像骨干。现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连&#xff0c;阻碍了蓬勃发展…

SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 Docker部署MYSQL主从详细教程-阿木木AEcru…