elasticsearch的Query DSL中must和filter有什么区别?


70

我是弹性搜索的新手,在must和filter之间感到困惑。我想在我的条款之间执行and操作,所以我这样做了

开机自检/ xyz / _search

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "city": "city1"
                    }
                },
                {
                    "term": {
                        "saleType": "sale_type1"
                    }
                }
            ]
        }
    }
}

这给了我所需的结果,既匹配了术语,又使用了像这样的过滤器

开机自检/ xyz / _search

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "city": "city1"
                    }
                }
            ],
            "filter": {
                "term": {
                    "saleType": "sale_type1"
                }
            }
        }
    }
}

我得到相同的结果,所以什么时候应该使用must和什么时候应该使用filter?有什么不同?


2
Elastcisearch官方文档的直接答案可以在这里找到。
Avr

Answers:


80

must有助于得分。在filter,查询的分数将被忽略。

mustfilter,子句(查询)必须出现在匹配的文档中。这就是获得相同结果的原因。

您可以检查此链接

得分

每个文档的相关性得分由正浮点数(称为)表示_score。越高_score,文档越相关。

查询子句_score为每个文档生成一个。

要知道如何计算分数,请参考此链接


15
并没有真正回答何时将使用must vs过滤器。就像什么时候分数对任何事物都重要>?
intiha

13
@intihafilter用于更快的搜索,因为没有要计算的分数,也没有排名要完成。计分变得很重要,因为您不介意相关性。搜索字词的出现次数,匹配文档的长度,或者是否要添加boost到查询中以升级匹配文档。
卡丹

2
如果您的所有查询均为布尔值,则@intiha分数并不重要。可以缓存在过滤器中使用的子句:“过滤器子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被认为用于缓存。” 参考:elastic.co/guide/en/elasticsearch/reference/current/…–
Paul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.