Elasticsearch中MUST和SHOULD bool查询的区别

ES中的MUSTSHOULD bool查询之间的区别是什么?

如果我只有想要包含我的项的结果,那么我应该使用must吗?

我有一个查询,应该只包含某些值,也没有结果,有一个较低的日期/时间戳比今天的时间/日期-现在

我可以使用多个过滤器内部必须像下面的代码:

"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
198860 次浏览

文档中所述:

必须:子句(查询)必须出现在匹配的文档中。

应该:子句(查询)应该出现在匹配的文档中。在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。可以使用minimum_should_match参数设置要匹配的should子句的最小数量。

换句话说,必须子句中的查询必须与所有匹配(如果没有必须子句,则必须与应该子句中的至少一个匹配)。

因为你想要你的结果满足所有的查询,你应该使用必须


您确实可以在布尔查询中使用过滤器。

必须表示:子句(查询)必须出现在匹配的文档中。这些子句必须匹配,如逻辑

应该表示:这些子句中至少有一个必须匹配,如逻辑

基本上它们就像逻辑运算符AND和OR一样被使用。看到

现在在bool查询中:

必须表示:必须与要包含的文档匹配的子句。

应该表示:如果这些子句匹配,则增加_score;否则,它们就没有效果。它们只是用于细化每个文档的相关性评分。


是的,你可以在must中使用多个过滤器。

由于这是一个很受欢迎的问题,我想补充一点,在Elasticsearch版本2中,事情发生了一些变化。

应该在顶层使用bool查询,而不是filtered查询。

如果你不关心must部分的分数,那么将这些部分放入filter键中。没有评分意味着更快的搜索速度。此外,Elasticsearch将自动找出是否缓存它们,等等。must_not对于缓存同样有效。

参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

另外,注意"gte": "now"不能被缓存,因为它是毫秒级的粒度。在must子句中使用两个范围:一个范围使用now/1h,另一个范围使用now,这样第一个范围可以缓存一段时间,第二个范围用于在较小的结果集上加速精确过滤。