弹性搜索中must_not和filter之间的区别

时间:2017-11-10 15:45:26

标签: elasticsearch

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

E.g。在这里(取自elasticsearch definitive guide),为什么还不能用于范围?

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "range": { "date": { "gte": "2014-01-01" }} 
        }
    }
}

特别关注this documentation,在我看来它们完全相同:

  

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

     

must_not :子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着忽略评分并考虑使用子句进行高速缓存。由于忽略了评分,因此会返回所有文档的0分。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

当需要在结果中显示匹配的文档时使用过滤器,而当结果中不显示匹配的文档时使用Must_not。进一步分析:

过滤器:

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

绝不是

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

Tabular comparision