在elasticsearch中查询DSL中的must和filter之间有什么区别?

Kra*_*ash 45 filter querydsl elasticsearch

我是弹性搜索的新手,我在必须和过滤器之间感到困惑.我想在我的条款之间执行和操作,所以我这样做了

POST/xyz/_search

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "city": "city1"
                    }
                },
                {
                    "term": {
                        "saleType": "sale_type1"
                    }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我所需的结果匹配这两个术语,并使用这样的过滤器

POST/xyz/_search

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "city": "city1"
                    }
                }
            ],
            "filter": {
                "term": {
                    "saleType": "sale_type1"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Vij*_*pta 55

must有助于得分.在filter,忽略查询的分数.

在这两个mustfilter的条款(查询)必须出现在匹配文档.这是获得相同结果的原因.

您可以查看此链接

得分了

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

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

要了解如何计算得分,请参阅此链接

  • 当使用必须vs过滤器时,并没有真正回答.因为什么时候得分很重要>? (5认同)
  • @intiha使用`filter`可以进行更快的搜索,因为没有要计算的分数,也没有排名要完成。计分变得很重要,因为您不介意相关性。搜索字词的出现次数,匹配文件的长度,或者是否要向查询中添加“ boost”以升级匹配文件。 (2认同)
  • 如果您的所有查询都是布尔值,@intiha 分数并不重要。过滤器中使用的子句可能会被缓存:“过滤器子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。” 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html (2认同)
  • @Cardin你的评论应该是这个问题的最佳答案。尝试把它写出来作为答案 (2认同)

Car*_*din 9

must返回每个匹配文档的分数。此分数可帮助您对匹配文档进行排名,并比较文档之间的相对相关性(使用每个文档的分数大小)。

由此,可以说,文件 1 的相关性是文件 2 的 3 倍。或者说,文件 1 至 7 的相关性比文件 8+ 及以后的相关性高得多。

关于相对分数的确定方法,您可以参考以下参考资料。
简而言之,它与文档中术语出现的次数、文档长度以及数据库索引中术语出现的平均次数有关。


filter不返回分数。只能说,所有匹配的文档都是相关的。但这无助于评估一个是否比另一个更相关。您可以将filter其视为must只有 2 个分数:零或非零,并且所有零分文档都会被删除。

filter如果您只想将属于主题“宠物”的所有文档列入白名单/黑名单,这会很有帮助。


总而言之,有 3 点可以帮助您决定何时使用什么:

  1. must是您按相关性对文档进行比较/排名时的唯一选择
  2. filter如果你不关心分数/排名
  3. filter速度快很多,因为 Elasticsearch 不需要计算分数

参考: