Elasticsearch中must_not和filter的区别

jjhzyzn0  于 2023-04-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(228)

有人能解释一下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" }} 
        }
    }
}

具体看this documentation,在我看来它们完全相同:

filter:子句(查询)必须出现在匹配的单据中。然而,与必须不同的是,查询的分数将被忽略。过滤器子句在过滤器上下文中执行,这意味着忽略评分,并考虑缓存子句。
must_not:子句(查询)不得出现在匹配文档中。子句在筛选器上下文中执行,这意味着忽略评分,并考虑缓存子句。由于评分被忽略,因此返回所有文档的评分0。

2g32fytz

2g32fytz1#

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

过滤器:

1.它是用Filter context写的。
1.它不影响结果的得分。
1.匹配的查询结果将显示在结果中。
1.完全匹配,而不是部分匹配。

must_not:

1.在相同的过滤器上下文上再次写入它。
1.这意味着它不会影响结果的得分。
1.与此条件匹配的文档将不会出现在结果中。
1.完全匹配。

zvokhttg

zvokhttg2#

基本上,filter = must,但没有得分。
must_not表示必须不满足的条件,而filter(和must)表示必须满足才能选择文档的条件。

相关问题