ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)

这篇具有很好参考价值的文章主要介绍了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.

    @Test
    public void testMatchAll() throws IOException {
        //1.准备 SearchRequest
        SearchRequest 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) {
            //获取source
            String json = searchHit.getSourceAsString();
            System.out.println(json);
        }
    }

由上可以看出查询的基本步骤如下:

  1. 创建 SeaechRequest 对象,指定索引库.
  2. Request.source() 准备参数,也就是 DSL.
    1. 通过 QueryBuilders 构建查询条件.
    2. 传入 Request.source() 的 query() 方法,构建好完整的查询.
  3. 发送请求,得到结果.
  4. 解析结果(又外而内,逐层解析).
DSL 请求的对应格式

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

DSL 语句的构建是通过 HighLevelRestClient 中的 Resource 实现的,其中包含了 查询、排序】分页、高亮等所有功能.

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

其中  query 表示查询的意思,他的查询条件的是由 QueryBuilders 的工具类提供的,包含了各种查询方法.

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

响应的解析

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

响应解析这里,可以在 Kibana 上通过查询结果,对比着看出 API 的调用关系.

1.1.2、全文检索查询

全文检索的 match 和 multi_match 查询和前面演示的 match_all 调用的 API 基本一致,差别就是查询条件,也就是 query 部分(通过 QueryBuilders 构建的条件不一样).

    @Test
    public void testMatch() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchQuery("brand", "如家"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

multi_match 也是如此,只是可以支持多个参数查询.

    @Test
    public void testMultiMatch() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.multiMatchQuery("如家", "brand", "name"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

运行结果:

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

1.1.3、精确查询

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

    @Test
    public void testTerm() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.termQuery("city", "上海"));
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

range 查询也是如此.

    @Test
    public void testRange() throws IOException {
        //1.准备 SearchRequest
        SearchRequest 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);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

1.1.4、复合查询

布尔查询是一个或多个查询子句的组合. 子查询的组合方式有:

  • must:必须匹配的查询条件,类似 “与”.
  • should:选择性匹配的查询条件,类似 “或”.
  • must_not:必须不匹配,不参与算分,类似 “非”.
  • filter:必须匹配,不参与算分

RestAPI 中也提供 BoolQueryBuilder 条件构建方法,用来添加上述条件.

    @Test
    public void testBoolQuery() throws IOException {
        //1.准备 SearchRequest
        SearchRequest 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);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

1.1.5、排序和分页

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

    @Test
    public void testFromSize() throws IOException {
        //1.准备 SearchRequest
        SearchRequest request = new SearchRequest("hotel");
        //2.准备参数
        request.source().query(QueryBuilders.matchAllQuery());
        //分页 offset=20 size=10
        request.source().from(20).size(10);
        //降序排序
        request.source().sort("price", SortOrder.DESC);
        //3.发送请求,并接收响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析响应
        handlerResponse(response);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

1.1.6、高亮

高亮的  API 包括请求构建 DSL 语句 和 结果解析 两个部分.

请求构建如下:

    @Test
    public void testHighLighter() throws IOException {
        //1.准备 SearchRequest
        SearchRequest 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);
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

响应解析如下 :

    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) {
            //获取source
            String json = searchHit.getSourceAsString();
            System.out.println(json);
            //2.处理高亮
            //获取高亮
            Map<String, HighlightField> highlightFieldMap = searchHit.getHighlightFields();
            if(!CollectionUtils.isEmpty(highlightFieldMap)) {
                //获取高亮字段的 value
                HighlightField highlightField = highlightFieldMap.get("name");
                if(highlightField != null) {
                    //取出高亮结果数组中的第一个,这里是酒店名称
                    String name = highlightField.getFragments()[0].string();
                    //对高亮字段的处理(这里打印做演示)
                    System.out.println(name);
                }
            }
        }
    }

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

运行后可以看到通过 sout 打印出的“高亮”字段(最后会传输给前端 ,让前端处理高亮. 后端只是标记出了哪些字段需要高亮处理)

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎

ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮),ElasticSearch,elasticsearch,大数据,搜索引擎文章来源地址https://www.toymoban.com/news/detail-730261.html

到了这里,关于ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch系列 - SpringBoot整合ES:多个精确值查询 terms

    ElasticSearch - SpringBoot整合ES:多个精确值查询 terms 01. ElasticSearch terms 查询支持的数据类型 在Elasticsearch中,terms查询支持多种数据类型,包括: 字符串类型:可以将多个字符串值作为数组传递给terms查询,以匹配包含任何一个指定字符串值的文档。 数值类型:可以将多个数值作

    2024年02月16日
    浏览(54)
  • Elasticsearch:了解和使用 match 查询

    Match query 是针对多个用例的最常见和最强大的查询。 它是一个全文搜索查询,返回符合指定条件的文档。 match query 可以即兴使用来查询多个选项。在我之前的文章 “开始使用 Elasticsearch (2)” 对它有很多的描述。 让我们首先看看这个片段显示的 match query 的格式: 正如你

    2024年02月07日
    浏览(37)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(91)
  • Elasticsearch 中的 term、terms 和 match 查询

    目录 term 查询 terms 查询 match 查询 注意事项 结论    Elasticsearch 提供了多种查询类型,用于不同的搜索需求。 term 、 terms 和 match 是其中最常用的一些查询类型。下面分别介绍每种查询类型的用法和特点。   term 查询用于精确值匹配。它通常用于(keyword)类型的字段,

    2024年04月14日
    浏览(35)
  • Elasticsearch:Multi-match (multi_match) 及 Disjunction max 查询

    多重匹配(multi_match)查询,顾名思义就是跨多个字段搜索查询。 例如,如果我们想在 title、synopsis 和 tags 三个字段中搜索 Java 一词,那么 multi_match query 就是答案。另外,很多开发者还不是很清楚 multi-match 及 disjunction max query 的区别和联系。在今天的文章中,我将详述这两个

    2024年02月05日
    浏览(31)
  • ElasticSearch中查询语句用法(match、match_phrase、multi_match、query_string)

    略 1.1 不同字段权重         如果需要为不同字段设置不同权重,可以考虑使用 bool 查询的 should 子句来组合多个 match 查询,并为每个 match 查询设置不同的权重。         上面的查询将在 product_name 字段和 description 字段中搜索包含 \\\"apple\\\" 的文档,并为 product_name 字段设

    2024年02月10日
    浏览(30)
  • ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html 1. 数据准备 官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。 2. m

    2023年04月08日
    浏览(34)
  • ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? match_phrase查询是一种用于匹配短语的查询方式,可以用于精确匹配多个单词组成的短语。它会将查询字符串分解成单词,然后按照顺序匹配文档中的单词,只有当文档中的单词顺序与查询字符串中的单词顺序完全

    2024年02月12日
    浏览(36)
  • ElasticSearch系列 - SpringBoot整合ES:多字段查询 multi_match

    1. 什么是 ElasticSearch 的 multi_match 查询? 有时用户需要在多个字段中查询,除了使用布尔查询封装多个match查询之外,可替代的方案是使用multi_match。可以在multi_match的query子句中组织数据匹配规则,并在fields子句中指定需要搜索的字段列表。 以下是一个示例multi-match查询

    2023年04月21日
    浏览(50)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包