ES中 minimum_should_match 的用法和误区

背景

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

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

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

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倍,如果不带,也没有关系。

推荐阅读:

<think>好的,我现在需要解决用户关于Elasticsearchminimum_should_matchmust组合查询的问题。用户希望得到用法示例及行为解析。首先,我需要回忆这两个概念的基本作用,然后考虑它们如何一起使用。 minimum_should_match属于布尔查询中的should子句,用来控制至少需要满足多少should条件。而must子句则是必须满足的条件。当两者结合时,must的条件必须全部满足,同时should的条件需要满足minimum_should_match的要求。 接下来,我需要确定如何构造这样的查询。例如,一个must子句可能包含过滤条件,而should子句用来提升相关性。这时候minimum_should_match可以设置为1,确保至少满足一个should条件。但用户可能想知道具体的语法示例。 然后,我需要考虑不同的使用场景。比如,当mustshould同时存在时,是否需要设置minimum_should_match的数值?默认情况下,如果存在must或filter,should子句的匹配是可选的,但通过设置minimum_should_match可以强制要求满足一定数量的should条件。 此外,还要注意参数的位置。minimum_should_match是放在bool查询的顶层还是should子句内部?根据Elasticsearch的文档,应该放在bool查询的顶层,作为参数来影响所有should子句。 然后,我需要构造一个示例查询。例如,查找必须满足某个must条件,同时至少满足两个should条件中的一定数量。比如,用户查找标题必须包含“Elasticsearch”,正文必须包含“指南”,同时至少满足两个should条件中的一个:标签包含“教程”或作者是“张三”。这时候minimum_should_match设置为1。 另外,需要解释默认行为。当没有must或filter时,should需要满足至少一个条件,但如果存在must,则should的条件默认是可选的,除非显式设置minimum_should_match。因此,用户需要明确设置该参数以确保should条件得到满足。 还要注意可能的错误,比如在只有should的情况下忘记设置minimum_should_match导致查询行为不符合预期。或者,当should子句不存在时,设置minimum_should_match会导致错误。 最后,总结使用时的注意事项,比如参数的放置位置、默认行为的差异,以及如何根据需求调整参数值。确保用户能够理解组合查询的逻辑,并正确应用在实际场景中。</think>在 Elasticsearch 中,`minimum_should_match` `must` 的组合使用可以实现「必须满足所有 must 条件」且「至少满足指定数量的 should 条件」的复杂查询逻辑。以下是具体示例解析: --- ### 一、组合查询语法结构 ```json { "query": { "bool": { "must": [ /* 必须满足的条件 */ ], "should": [ /* 可选条件,需满足 minimum_should_match */ ], "minimum_should_match": 1 } } } ``` --- ### 二、典型场景示例 #### 场景:搜索包含关键词 "Elasticsearch" 且满足至少一个 should 条件的文档 ```json { "query": { "bool": { "must": [ { "match": { "title": "Elasticsearch" }} ], "should": [ { "match": { "content": "性能优化" }}, { "match": { "content": "入门指南" }} ], "minimum_should_match": 1 } } } ``` #### 行为解析: 1. **must 子句**:文档必须满足 `title` 包含 "Elasticsearch"; 2. **should 子句**:文档需至少满足 1 个条件(由 `minimum_should_match` 控制),即 `content` 包含 "性能优化" **或** "入门指南"; 3. **综合结果**:满足 `must` 条件的文档会被返回,且满足更多 `should` 条件的文档相关性评分更高[^1][^2]。 --- ### 三、关键规则说明 1. **must 的优先级**: - `must` 子句是 **强制条件**,不满足则直接排除文档; - `should` 子句在存在 `must` 或 `filter` 时默认 **不要求必须匹配**,除非显式设置 `minimum_should_match`[^1]。 2. **minimum_should_match 的取值**: - 固定数值:例如 `1` 表示至少匹配 1 个 should 条件; - 百分比:例如 `50%` 表示匹配半数条件; - 动态表达式:例如 `2<90%` 表示如果条件数超过 2,则需匹配 90%[^1]。 --- ### 四、常见问题解答 #### Q1:如果省略 `minimum_should_match` 会发生什么? - 当存在 `must` 或 `filter` 时,默认 `minimum_should_match=0`,即 should 条件仅用于提升相关性评分,不强制匹配; - 若无 `must` 或 `filter`,默认 `minimum_should_match=1`。 #### Q2:如何强制要求所有 should 条件必须满足? 设置 `minimum_should_match: 100%` 或具体数量等于 should 子句总数。 --- ### 五、进阶用法:与 `filter` 结合 ```json { "query": { "bool": { "must": [ { "term": { "status": "published" }} ], "filter": [ { "range": { "date": { "gte": "2023-01-01" }}} ], "should": [ { "match": { "tags": "urgent" }} ], "minimum_should_match": 1 } } } ``` - **行为**:文档需满足 `status=published` 且 `date>=2023-01-01`,同时 `tags` 包含 "urgent"(否则仅匹配 must+filter 但评分较低)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elastic开源社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值