elasticsearch中Query DSL中的must和filter有啥区别?
Posted
技术标签:
【中文标题】elasticsearch中Query DSL中的must和filter有啥区别?【英文标题】:What is the difference between must and filter in Query DSL in elasticsearch?elasticsearch中Query DSL中的must和filter有什么区别? 【发布时间】:2017-09-07 00:35:32 【问题描述】:我是弹性搜索的新手,我对必须和过滤器感到困惑。我想在我的术语之间执行一个 and 操作,所以我这样做了
POST /xyz/_search
"query":
"bool":
"must": [
"term":
"city": "city1"
,
"term":
"saleType": "sale_type1"
]
这给了我与这两个术语匹配的所需结果,以及使用这样的过滤器
POST /xyz/_search
"query":
"bool":
"must": [
"term":
"city": "city1"
],
"filter":
"term":
"saleType": "sale_type1"
我得到了相同的结果,那么我应该什么时候使用 must 以及什么时候应该使用 filter?有什么区别?
【问题讨论】:
【参考方案1】:must
有助于得分。在filter
中,查询的分数被忽略了。
在must
和filter
中,子句(查询)必须出现在匹配的文档中。这就是获得相同结果的原因。
您可以查看link
分数
每个文档的相关性分数由称为
_score
的正浮点数表示。_score
越高,文档的相关性越高。
查询子句为每个文档生成一个_score
。
要了解如何计算分数,请参阅link
【讨论】:
在使用 must vs 过滤器时并没有真正回答。什么时候得分对任何事情都很重要>? @intiha 使用filter
进行更快的搜索,因为无需计算分数,也无需进行排名。当你关心说相关性时,得分变得很重要。搜索词的出现次数、匹配文档的长度,或者是否要将 boost
添加到查询中以提升匹配文档的排名。
@intiha 如果您的所有查询都是布尔值,那么分数并不重要。过滤器中使用的子句可能会被缓存:“过滤器子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。”参考:elastic.co/guide/en/elasticsearch/reference/current/…
我认为当您有一个复合查询时,它也很重要,其中内部查询的分数用于计算总分。 must_not
也一样。以上是关于elasticsearch中Query DSL中的must和filter有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch Query DSL概述与查询过滤上下文
ES(elasticsearch) query DSL 查询语法