ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

这篇具有很好参考价值的文章主要介绍了ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DSL 查询种类

  • 查询所有:查询所有数据,一般在测试时使用。march_all,但是一般显示全部,有一个分页的功能
  • 全文检索(full text)查询:利用分词器对用户的输入内容进行分词,然后去倒排索引库匹配。例如:
    • match_query
    • mutil_match_query
  • 精确查询:根据精确词条值查询数据,一般查找的时keyword、数值、日期、boolean等字段。例如:
    • ids
    • term
    • range
  • 地理查询(geo):根据经纬度查询,例如:
    • geo_distance
    • geo_bounding_box
  • 复合(compound)查询:复合查询时将上面各种查询条件组合在一起,合并查询条件。例如:
    • bool
    • funcation_score

DSL query 基本语法

1、全文检索

# DSL查询
GET /indexName/_search
{
  "query":{
    "查询类型":{
      "查询条件":"条件值"
    }
  }
}

match 与 multi_match 的与别是前者根据单字段查,后者根据多字段查。
参与搜索的字段越多,查询效率越低,建议利用copy_to将多个检索字段放在一起,然后使用match—all字段查。

GET /hotel/_search
{
  "query": {
    "match": {
      "city": "上海"
    }
  }
}

GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  }
}

 GET /hotel/_search
 {
   "query": {
     "multi_match": {
       "query": "如家",
       "fields": ["name","brand","business"]
     }
   }
 }

2、精确查询

精确查询: term字段全值匹配,range字段范围匹配。
精确查询一般查找keyword、数值、boolean等不可分词的字段

# term
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "北京"
      }
    }
  }
}
# range
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gt": 1000,
        "lt": 2000
      }
    }
  }
}

3、地理查询

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

GET /hotel/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

GET /hotel/_search
{
  "query": {
    "geo_distance": {
      "distance": "20km",
      "location": {
        "lat": 31.13,
        "lon": 121.8
      }
    }
  }
}

4、function score (算分控制)

复合查询(compound ):将简单查询条件组合在一起,实现复杂搜索逻辑。

  • function score:算分函数查询,可以控制文档的相关性算分,控制排名。例如百度竞价

es在5.1及之后就弃用了 TF-IDF 算法,开始采用 BM25算法。BM25算法不会因为词的出现频率变大而导致算分无限增大,会逐渐趋近一个值
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

function score query :可以修改文档相关性算分,得到新的算分。
三要素

  • 过滤条件:决定哪些条件要加分
  • 算分函数:如何计算function score
  • 加权方式:function score 与 query score如何运算
    ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "如家酒店"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "city": "上海"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "sum"
    }
  }
}

5、bool 查询

boolean query:布尔查询是一个或多个子查询的组合。

  • must:必须匹配每个子查询,类似”and“
  • should:选择性匹配子查询,类似”or“
  • must_not:必须不匹配,不参与算分,类似”非“
  • filter:必须匹配,不参与算分
    ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "all": "上海"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gt": 500
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 31.21,
              "lon": 121.5
            }
          }
        }
      ]
    }
  }
}

搜索结果处理

1、排序

es支持对搜索结构进行排序,默认是根据相关度算分(_score)进行排序。可以排序的字段有keyword,数值、地理坐标、日期类型等。

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },"sort": [
    {
      "id": {
        "order": "desc"
      }
    }
  ]
}
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },"sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 31.2,
          "lon": 121.5
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

这个排序的结果就是相聚的公里数。
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

2、分页

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
针对深度分页;ES给出了两种方案

  • search after:分页时需要排序,原理是从上次的排序值开始(末尾值),查询下一页的数据。官方推荐使用,不会太占内存。手机向下反动滚页。
  • scroll:原理是将排序数据形成快照,保存在内存。不推荐

3、高亮

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

ES默认搜索字段和高亮字段必须一致,否则不会高亮。或者使用 "require_field_match": "false" 也能高亮。

最后将查询结果中 highlight 与 指定高亮的字段进行替换返回给前端就行。
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

RestClient操作

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java
普通查询

    @Test
    public void  testMatchAll() throws IOException {
        SearchRequest searchRequest = new SearchRequest("hotel");
        searchRequest.source().query(
                QueryBuilders.matchAllQuery()
        );
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        SearchHits searchHits = searchResponse.getHits();

        long value = searchHits.getTotalHits().value;
        System.out.println(value);
        SearchHit[] hits = searchHits.getHits();
        System.out.println(hits[0]);
        HotelDoc hotelDoc = JSON.parseObject(hits[0].getSourceAsString(), HotelDoc.class);
        System.out.println(hotelDoc);
    }





        QueryBuilders.matchAllQuery()
        QueryBuilders.matchQuery("all","如家")
        QueryBuilders.multiMatchQuery("如家","name","brand","business")
        QueryBuilders.termQuery("city","上海")
        QueryBuilders.rangeQuery("price").gt(100).lt(400)
        
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termQuery("city","北京"));
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gt(100).lt(400));

分页和排序

    public void testPageAndSort() throws IOException {
        int pageNum = 2, pageSize = 10;

        SearchRequest searchRequest = new SearchRequest("hotel");
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brand", "如家");
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("all", "北京");
        boolQueryBuilder.must(termQueryBuilder);
        boolQueryBuilder.must(matchQueryBuilder);

        searchRequest.source().query(boolQueryBuilder);
        searchRequest.source().from((pageNum - 1) * pageSize).size(pageSize);
        searchRequest.source().sort("price", SortOrder.ASC);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

高亮

    public void testHighLight() throws IOException {
        SearchRequest searchRequest = new SearchRequest("hotel");

        searchRequest.source().query(QueryBuilders.matchQuery("all","如家"));
        searchRequest.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);

            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(!highlightFields.isEmpty()){
                HighlightField highlightField = highlightFields.get("name");
                //一般value只有一个元素,取数组第一个
                String name = highlightField.getFragments()[0].string();
                hotelDoc.setName(name);
            }
            System.out.println(hotelDoc);
        }
    }

算分
让指定酒店置顶 (function_score )广告业务
ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等),ElasticSearch,elasticsearch,大数据,搜索引擎,java文章来源地址https://www.toymoban.com/news/detail-659969.html

    // 算分控制
    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
            // 原始查询
            boolQueryBuilder,
            // FunctionScore 数组
            new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                            QueryBuilders.termQuery("isAD", true),
                            ScoreFunctionBuilders.weightFactorFunction(10)
                    )
            }
    );

到了这里,关于ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 第七章-分布式搜索引擎-ES:全文查询、分词查询、精确查询、地理坐标查询、组合查询(bool、funtion_score)以及RestApi

    DSL查询分类 全文查询、分词查询、非分词查询、地理坐标查询、组合查询 match_all 查询所有,不需要查询条件,固定写法_search 第一个hits就是命中的数据 ,total就是条数,第二个hits是source嘞   全文检索查询 我们不要整多个字段查询,参与的字段越多,查询速度越慢,如果有

    2024年01月16日
    浏览(46)
  • Elasticsearch查询 - Bool查询

    在Elasticsearch中, Bool查询 是一种 组合查询 ,可以用于将多个查询组合在一起,并使用 逻辑运算符 (AND、OR、NOT)对它们进行组合。与其他三种基本查询不同,Bool查询可以实现更为复杂的查询需求。 下面对四种基本查询和Bool查询进行简单对比: Term Query: 精确匹配 单个值,

    2024年02月06日
    浏览(31)
  • Elasticsearch之常用DSL语句

    目录   1. Elasticsearch之常用DSL语句 1.1 操作索引 1.2 文档操作 1.3 DSL查询 1.4 搜索结果处理 1.5 数据聚合   mapping是对索引库中文档的约束,常见的mapping属性包括: - type:字段数据类型,常见的简单类型有:   - 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家

    2024年02月04日
    浏览(29)
  • java直接使用dsl语句查询ES

    2024年02月03日
    浏览(27)
  • 工作常用ES DSL查询语句(干货满满)

       工作中几乎每天都需要使用到ES查询数据,需要根据自己的查询需求构造DSL查询语句来实现,本文记录并分享本人工作中常用的DSL语句以及所遇到问题的解决方案,DSL语句灵活多变,可进行多种组合,任你搭配,让我们一起往下看,希望对你有帮助。 2.1 查看所有索引的

    2024年02月02日
    浏览(68)
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询

    01. ElasticSearch 布尔查询是什么? 在实际应用中,我们很有可能会查询多个值或字段。 一个 bool 查询由三部分组成: must:所有的语句都必须(must) 匹配,与 AND 等价。 must_not:所有的语句都不能(must not)匹配,与 NOT 等价。 should:至少有一个语句要匹配,与 OR 等价。 02.

    2023年04月08日
    浏览(50)
  • Elasticsearch 中 bool组合查询(must 和 should 组合)

    需求 查询考试成绩是 60分 或 90分 的 女生 。 所以查询条件应该这么写 sex == \\\'女\\\' ( score == 60 || score ==90 );  先看下bool的语法 在ES中的实现 方式一: 在bool查询的must 中再嵌套一层bool来做should过滤。 方式二: 使用 minimum_should_match 选项 ,至少匹配一项should子句。 GET stu/_search

    2023年04月09日
    浏览(24)
  • ElasticSearch - DSL查询语法

    目录 DSL查询分类 全文检索查询 精确查询 地理查询 复合查询 相关性算分 算分函数查询 BooleanQuery DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询 常见的查询类型包括: 查询所有:查询出所有的数据,一般测试用;例如:match_all 全文检索(full text)查询

    2023年04月08日
    浏览(37)
  • 【ElasticSearch】DSL查询语法

    Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。官方文档: 其中,常见的查询类型有: 查询所有 :查询出所有数据,一般测试用。例如: 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: 精确查询 :根据精确

    2024年02月16日
    浏览(29)
  • 【Elasticsearch】DSL查询文档

    目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 1.5.2.算分函数查询 1)语法说明 2)示例 3)小

    2024年02月16日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包