ES中 minimum_should_match 的用法和误区

简介: ES中 minimum_should_match 的用法和误区

背景

写这篇文章是因为有个同学在群里发了这么一张截图,图中讲的两点关于``的描述,我看了一眼,两个都是错的。

322afe7153074af3b0a75e681989df9f.png

目前互联网上的文章质量参差不齐,这也算是为了提高网络博客的质量进一己之力吧。

4c40ff6495de4642823bf0c5581680ea.png


上述截图中的两个认知误区

1、不能简单的说 7.0 版本之后 默认值是 0 或者 1

minimum_should_match是ES组合查询中的一个常用参数,参数指定should子句返回的文档必须匹配的子句的数量或百分比。注意这里可以输具体的数量,也可以是百分数指定。并且满足以下两个条件:

  • 如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。即此时minimum_should_match如果没有显示的配置,should子句中的条件必须至少满足一个。
  • 如果bool查询包包含mustfilter子句,则minimum_should_match默认值为0,即:此时minimum_should_match如果没有显示的配置,此时should子句中可以不满足任何条件。


2、minimum_should_match并不是非用不可

minimum_should_match可以控制查询精度,在should和must联合查询查询时必须使用”,这句话的描述也存在问题。下面通过一个习题案例,来证明:


Task:

假设有movie_data索引包含如下文档:

{
  "minutes": 136,
  "movie_id": "1893",
  "title": "Star Wars: Episode I - The Phantom Menace",
  "tags": [
    "prophecy",
    "senate",
    "queen",
    "taskmaster",
    "galaxy",
    "apprentice",
    "taxes",
    "space opera"
  ],
  "revenue": 924317558,
  "release_date": "1999-05-19T06:00:00.000Z",
  "budget": 115000000,
  "avg_score": 6.3
}


movie_data索引上写一个单独的搜索,满足以下要求:

  • title 字段包含memy
  • tags字段带有romantic comedy标签的文档得分权重高于标签中不包含romantic comedy标签的文档。


答案

GET movie_data/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "my me"
          }
        }
      ],
      "should": [
        {
          "match": {
            "tags.keyword": {
              "query": "romantic comedy",
              "boost": 10
            }
          }
        }
      ]
    }
  }
}


分析

这里只针对should子句展开分析,也就是题目的第二个要求。此题答案中同事包含了mustshould子句。


题目中只是说tags字段如果带有romantic comedy标签,那么它的得分权重更高。但是并没有要求带有romantic comedy标签是个必要条件。换句话说,就是带有romantic comedy标签,那么提高评分权重,如果不带,那么什么也不做。


答案中并未显示的配置minimum_should_match参数,所以此时minimum_should_match的默认值是0。即should子句中的条件可以完全不满足。也就是说should子句不会对最终结果的文档数产生影响。那么当前子句的语义则为:带有romantic comedy标签的文档,权重提升10倍,如果不带,也没有关系。

相关文章
|
5月前
|
缓存
Errors during downloading metadata for repository 'remi-modular' 问题如何解决?
Errors during downloading metadata for repository 'remi-modular' 问题如何解决?
471 5
|
7月前
|
Perl
pod spec lint编译时报error: include of non-modular header inside framework module
pod spec lint编译时报error: include of non-modular header inside framework module
112 1
|
7月前
Angular启动/node_modules/@types/node/index.d.ts (20,1): Invalid ‘reference‘ directive syntax.
Angular启动/node_modules/@types/node/index.d.ts (20,1): Invalid ‘reference‘ directive syntax.
87 2
(node)Warning: Accessing non-existent property ‘xxx‘ of module exports inside circular depen
(node)Warning: Accessing non-existent property ‘xxx‘ of module exports inside circular depen
codeforces 344B - Simple Molecules
题意就是给出3个原子的化学价,然后组成一个分子,要保证这个分子是稳定的,如果你还记得高中化学知识的话这个很容易理解,然后让你求出1-2 2-3 1-3 号原子之间有几条键, 这里我分别用ta tb tc 表示, 用数学的方法表示出来的话就是a = tc + tb; b = ta+tc; c = ta + tb;可能有多种情况,只要输出一种即可。
45 0
ES 布尔查询中 minimum_should_match 参数使用避坑
ES 布尔查询中 minimum_should_match 参数使用避坑
|
搜索推荐 索引
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
ts重点学习71-implement语句
ts重点学习71-implement语句
117 0
ts重点学习71-implement语句