Elasticsearch:应该 + minimum_should_match vs must

plc*_*hia 6 elasticsearch

我用这两个查询进行测试

用 must 查询

 {
  "size": 200,
  "from": 0,
  "query": {
  "bool": {
  "must": [ {
      "match": {
        "_all": "science"
      }
    },
    {
      "match": {
        "category": "fiction"
      }
    },
    {
      "match": {
        "country": "us"
      }
    }
   ]
 }
}
Run Code Online (Sandbox Code Playgroud)

}

使用 should + minimum_should_match 查询

  {
   "size": 200,
   "from": 0,
   "query": {
   "bool": {
   "should": [ {
       "match": {
         "_all": "science"
       }
     },
     {
      "match": {
        "category": "fiction"
        }
      },
      {
      "match": {
        "country": "us"
        }
      }
    ],
     minimum_should_match: 3
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

两个查询都给我相同的结果,我不知道这两个之间的区别,我们什么时候应该使用 minimum_should_match?

Ant*_*Val 9

我猜你的意思是minimum_number_should_match,对吧?

在这两种情况下,它是相同的,因为您在should. minimum_number_should_match通常在您的子句数量多于您在那里指定的数量时使用。

例如,如果您有 5 个 should 子句,但出于某种原因,您只需要满足其中的三个,您将执行以下操作:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "tag": "wow"
          }
        },
        {
          "term": {
            "tag": "elasticsearch"
          }
        },
        {
          "term": {
            "tag": "tech"
          }
        },
        {
          "term": {
            "user": "plchia"
          }
        },
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ],
      "minimum_should_match": 3
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这是正确且理想的行为。我们来稍微解读一下:

  • 带子句的布尔查询must意味着must要求section下的所有子句都匹配。就像英语一样——它意味着强烈的义务。
  • 带子句的布尔查询should意味着某些子句需要匹配,而其他子句则不需要(即软义务)。此处必须匹配的默认子句数量仅为 1。为了覆盖此行为,minimum_should_match参数将发挥作用。如果指定,minimum_should_match=3则意味着下面的 3 个子句should必须匹配。从实际角度来看,它与用 指定这些子句完全相同must

希望能详细解释一下。

  • 从 Elasticsearch 7.0 开始,它不再那么直观了。仅包含“should”子句的“bool”查询的默认“minimum_should_match”仍然为 1。但是同时包含“must”和“should”子句的“bool”查询的“minimum_should_match”为 0!请参阅/sf/answers/3430889381/ (4认同)