有人能解释一下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。
2条答案
按热度按时间2g32fytz1#
filter
用于匹配的文档需要显示在结果中,而must_not
用于匹配的文档不显示在结果中。进一步分析:过滤器:
1.它是用Filter context写的。
1.它不影响结果的得分。
1.匹配的查询结果将显示在结果中。
1.完全匹配,而不是部分匹配。
must_not:
1.在相同的过滤器上下文上再次写入它。
1.这意味着它不会影响结果的得分。
1.与此条件匹配的文档将不会出现在结果中。
1.完全匹配。
zvokhttg2#
基本上,
filter
=must
,但没有得分。must_not
表示必须不满足的条件,而filter
(和must
)表示必须满足才能选择文档的条件。