elasticsearch中must_not和filter的区别

sch*_*ida 11 elasticsearch

有人可以向我解释一下 elasticsearch 中 must_not 和 filter 之间的区别吗?

例如这里(取自elasticsearch 权威指南),为什么 must_not 不也用于范围?

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "range": { "date": { "gte": "2014-01-01" }} 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

具体看这个文档,在我看来它们是完全一样的:

filter:子句(查询)必须出现在匹配的文档中。然而,与 must 不同的是,查询的分数将被忽略。过滤器子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。

must_not:子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着忽略评分并考虑将子句用于缓存。由于评分被忽略,所有文档的评分为 0。

Sou*_*dra 13

filter当匹配的文档需要在结果中显示的使用,而must_not在使用时,匹配的文档不会在结果中显示。进一步分析:

筛选:

  1. 它是在Filter context 中编写的。
  2. 它不影响结果的分数。
  3. 匹配的查询结果会出现在结果中。
  4. 基于完全匹​​配,而不是部分匹配。

禁止:

  1. 它再次写入相同的过滤器上下文。
  2. 这意味着它不会影响结果的分数。
  3. 符合此条件的文档将不会出现在结果中。
  4. 基于精确匹配。

表格比较


Val*_*Val 6

基本上,filter=must但没有得分。

must_not表示必须不满足的条件,而filter(和must) 表示必须满足才能选择文档的条件。