首页 > 其他分享 >RestClient查询文档

RestClient查询文档

时间:2023-11-29 11:34:20浏览次数:33  
标签:RestClient SearchRequest request QueryBuilders source 文档 查询 response

前面我们已经实现利用DSL实现文档查询和后续结果处理,下面我们利用Java  RestClient实现前面的功能

一、快速入门

1.1.基本案例演示

我们通过match_all来演示下基本的APl,先看请求DSL的组织:查询所有的信息如下:

@SpringBootTest
public class HotelSearchTests {
    //创建成员变量,保存初始化的对象
    private RestHighLevelClient client;


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

    @AfterEach
    void testDown() throws IOException {
        this.client.close();
    }

    /**
     * 查询所有的数据
     * @throws IOException
     */
    @Test
    void testMatchAll() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        System.out.println(response);
    }
}

执行后结果如下:

RestClient查询文档_Test

1.2.结果解析

上面的操作完成后,我们需要对于返回的结果进行解析,通过解析拿出我们需要的信息:

RestClient查询文档_System_02

代码如下:

/**
     * 查询所有的数据
     * @throws IOException
     */
    @Test
    void testMatchAll() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1.查询总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到:"+total+"条数据");
        //4.2.查询的结果数组
        for (SearchHit hit : searchHits.getHits()) {
            //4.3.获取文档source
            String json = hit.getSourceAsString();
            //4.4.打印输出
            System.out.println(json);
            //4.5.反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = "+hotelDoc);
        }
    }

执行后结果如下:

RestClient查询文档_System_03

1.3.Query Builders的工具类

Rest API中其中构建查询条件的核心部分是由一个名为Query Builders的工具类提供的,其中包含了各种查询方法:

RestClient查询文档_System_04

在 Elasticsearch Java 客户端中,Query Builders 提供了一系列用于构建查询的工具类。这些工具类通常位于 org.elasticsearch.index.query 包中。以下是一些常用的 Query Builders 工具类及其方法:

  1. QueryBuilders.termQuery(String name, Object value):创建一个精确匹配的项查询。
  2. QueryBuilders.matchQuery(String name, Object value):创建一个全文匹配查询。
  3. QueryBuilders.boolQuery():创建一个布尔查询,用于组合多个查询条件。
  4. QueryBuilders.rangeQuery(String name):创建一个范围查询,用于匹配指定范围内的值。
  5. QueryBuilders.existsQuery(String name):创建一个存在性查询,用于匹配指定字段存在的文档。
  6. QueryBuilders.prefixQuery(String name, String prefix):创建一个前缀查询,用于匹配指定前缀的项。

这些方法通常用于构建查询条件,并且可以与其他查询条件组合使用。在使用这些方法时,通常需要将返回的查询对象添加到查询构建器中,然后将构建器用于执行搜索操作。

二、match查询

2.1.语法说明

全文检索的match和multi_match查询与match_all的APl基本一致,差别是查询条件,也就是query的部分。语法如下:

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

2.2.单字段查询

利用QueryBuilders.matchQuery("all","如家")完成单个字段查询

/**
     * 单字段查询
     * @throws IOException
     */
    @Test
    void testMatchQuery() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1.查询总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到:"+total+"条数据");
        //4.2.查询的结果数组
        for (SearchHit hit : searchHits.getHits()) {
            //4.3.获取文档source
            String json = hit.getSourceAsString();
            //4.4.打印输出
            System.out.println(json);
            //4.5.反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = "+hotelDoc);
        }
    }

执行后结果如下:

RestClient查询文档_字段_05

解析结果的代码是重复的代码,我们可以把它抽取出来,如下:

/**
     * 单字段查询
     * @throws IOException
     */
    @Test
    void testMatchQuery() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        //3.发送请求
        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.查询的结果数组
        for (SearchHit hit : searchHits.getHits()) {
            //4.3.获取文档source
            String json = hit.getSourceAsString();
            //4.4.打印输出
            System.out.println(json);
            //4.5.反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = "+hotelDoc);
        }
    }

2.2.多字段查询

多字段查询利用,QueryBuilders.multiMatchQuery("如家","name","business");完成

/**
     * 多字段查询
     * @throws IOException
     */
    @Test
    void testMultiMatchQuery() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.multiMatchQuery("如家", "name", "business"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //调用方法解析结构
        handleResponse(response);
    }

三、精确查询

3.1.语法说明

精确查询常见的有term查询和range查询,同样利用QueryBuilders实现,语法如下:

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

3.2.精确查询:词条查询

案例如下:

@Test
    void testTermQuery() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        request.source().query(QueryBuilders.termQuery("city","上海"));

        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析结构
        handleResponse(response);
    }

3.3.精确查询:范围查询

案例如下:查询价格在100到200之间的酒店信息

@Test
    void testRangeQuery() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200));

        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析结构
        handleResponse(response);
    }

执行后结果如下:

RestClient查询文档_Test_06

四、复合查询

4.1.语法说明

 复合查询,也就是组合查询,利用精确查询常见的有term查询和range查询,同样利用Query Builders实现:

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

4.2.案例

代码如下:

@Test
    void testBool() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        //2.1.准备BooleanQuery
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //2.2.添加term
        boolQuery.must(QueryBuilders.termQuery("city", "上海"));
        //2.3.添加range 价格小于等于400的
        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(400));

        request.source().query(boolQuery);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析结构
        handleResponse(response);
    }

执行后如下:

RestClient查询文档_字段_07

五、排序、分页、高亮

5.1.排序和分页

搜索结果的排序和分页是与query同级的参数,对应的API如下:

RestClient查询文档_Test_08

代码如下:

@Test
    void testPageAndSort() throws IOException {
        //页码和每页大小
        int page=1;
        int size=5;

        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        //2.1.准备Query
        request.source().query(QueryBuilders.matchAllQuery());
        //2.2.排序
        request.source().sort("price", SortOrder.ASC);
        //2.3.分页
        request.source().from((page-1)*size).size(size);

        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析结构
        handleResponse(response);
    }

执行后结果如下:

RestClient查询文档_Test_09

5.2.高亮

高亮API包括请求DSL和结果解析两部分

5.2.1.高亮请求DSL构建

语法如下:

RestClient查询文档_字段_10

代码如下:

@Test
    void testHighlight() throws IOException {

        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        //2.1.准备Query
        request.source().query(QueryBuilders.matchQuery("all", "如家"));
        //2.2.高亮: 由于上面查询的拷贝字段all,下面高亮显示的指定的是name字段,不一致,则需设置requireFieldMatch(false)
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //解析结构
        handleResponse(response);
    }

查看结果并没有高亮显示的部分,因为这里我们只是做了高亮的构建部分,结果解析部分还没有做,如下:

RestClient查询文档_字段_11

5.2.2.高亮结果解析

语法如下:

RestClient查询文档_字段_12

代码如下:

@Test
    void testHighlight() throws IOException {

        //1.准备request
        SearchRequest request = new SearchRequest("hotel");

        //2.准备DSL
        //2.1.准备Query
        request.source().query(QueryBuilders.matchQuery("all", "如家"));
        //2.2.高亮: 由于上面查询的拷贝字段all,下面高亮显示的指定的是name字段,不一致,则需设置requireFieldMatch(false)
        request.source().highlighter(
                new HighlightBuilder()
                        .field("name")
                        .requireFieldMatch(false));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //4.解析响应
        SearchHits searchHits = response.getHits();
        //4.1.获取总条数
        TotalHits total = searchHits.getTotalHits();
        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();

            //Spring给我们提供了一个工具类,为我们判断是否为空:CollectionUtils.isEmpty()
            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);
        }
    }

执行后结果如下:

RestClient查询文档_字段_13



标签:RestClient,SearchRequest,request,QueryBuilders,source,文档,查询,response
From: https://blog.51cto.com/u_13661275/8613026

相关文章

  • Golang Gin 获取Restful参数、URL查询参数,Form 表单参数,JSON格式参数
    前言http请求中,可以通过URL查询参数提交数据到服务器,可以通过post的json方式,还有一直方式就是Form表单。Form表单相比URL查询参数,用户体验好,可以承载更多的数据,尤其是文件上传时,特别方便。这里推荐飞雪无情的博客;写了一些列的gin的使用教程,很时候新手学习如果想对gin有一个完整......
  • JS对象文档 - FormData
    前言FormData接口提供了一种表示表单数据的键值对key/value的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send()方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为"multipart/form-data",它会使用和表单一样的格式。正文构造函数constformData=n......
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO entityManager.createNativeQuer
    SpringBootJPA实践之EntityManage查询返回自定义DTOentityManager.createNativeQuery(sql)  在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与......
  • WebOffice网页版在线Office的Word文档权限控制,限制编辑,只读、修订模式、禁止复制等。
    在一些在线Office文档中,有很多重要的文件需要保密控制,比如:报价单、客户资料等数据,只能给公司成员查看,但是不能编辑,并且不能拷贝,防止重要资料外泄。可以通过猿大师办公助手的在线Office的文档编辑权限来解决这些问题!第一步:下载安装猿大师办公助手,并获得试用授权。猿大师办公助手......
  • 使用React+SpringBoot开发一个协同编辑的表格文档
    本文由葡萄城技术团队发布。转载请注明出处:[葡萄城官网],葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求。通过协同编辑,多个用户可以同时对同一个文档进行编辑和更新,从而提高工作效......
  • 使用React+SpringBoot开发一个协同编辑的表格文档
    本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求。通过协同编辑,多个用户可以同时对同一个文档进行编辑和更新,从而提高工作效......
  • 百度文库文档下载
    转自up主黄大司https://www.bilibili.com/video/BV1G3411L7jQ/?spm_id_from=333.337.search-card.all.click&vd_source=e265d8ea3fdaf4527725d5b410a0de3b转自up主蔡小硕丶https://www.bilibili.com/video/BV15B4y187Hn/?spm_id_from=333.337.search-card.all.click&vd_source=......
  • mysql语句查询最大值并获取
    publicintexadd(examexam)throwsException{Connectionconnection=DBUtil.dbCon();Stringsql="selectmax(eid)eidfromjuan";PreparedStatementpstmt=null;......
  • 基于springboot的课程作业管理系统-计算机毕业设计源码+LW文档
    一、 研究目的和意义当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能......
  • 基于springboot的社区团购系统-计算机毕业设计源码+LW文档
    1、立论依据(课题来源、选题依据和背景情况、课题研究目的、理论意义和实际应用价值)(1)课题来源、选题依据和背景情况 本课题来自于自拟项目。 近年来,全球经济的高速发展,在一定程度上,促进了互联网技术的发展,信息化管理行业在生活中占据着越来越重要的地位,使得人们的生活方式发......