Elasticsearch必须和应该布尔查询之间的区别


168

ES中的bool查询MUSTSHOULDbool查询有什么区别?

如果我想要包含我的条款的结果,那我应该使用must

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

我可以在下面的代码中使用多个过滤器吗:

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

Answers:


249

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

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

基本上,它们的使用类似于逻辑运算符AND和OR。看到这个

现在在布尔查询中

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

应该表示:如果这些子句匹配,则增加_score; 否则,它们将无效。它们仅用于完善每个文档的相关性得分。


是的,您可以在内部使用多个过滤器must


派对晚了一点,但是must类别,价格和should属性(例如大小和颜色)如何。现在,如果选择了L和XL尺寸,则两者之间应该是一个值,但是如果同时选择了绿色,则必须是(L或XL尺寸)AND(绿色)必须具有的颜色。那可能吗?
MAVE

我认为在这种情况下,过滤器可能是一种更好的属性处理方法。它们是针对完全匹配而不是基于相关性的搜索而设计的。有关更多信息,请参阅文档中的查询和过滤器
Jim K.

6
我认为您需要minimum_number_should_match = 1执行“至少这些子句之一必须匹配”的想法。
Jim K.

好答案!我只想分享文档的一部分,这对我理解这一点非常有帮助。elastic.co/guide/en/elasticsearch/guide/current/...
ba0708

1
JimK-或没有必须条款。如果没有must子句,则意味着minimum_number_should_match。
LizH '17

15

既然这是一个受欢迎的问题,我想补充一点,在Elasticsearch版本2中,情况有所变化。

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

如果您不在乎must零件的分数,则将这些零件放入filter钥匙中。没有得分就意味着搜索速度更快。而且,Elasticsearch将自动确定是否缓存它们,等等must_not对于缓存同样有效。

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

另外,请注意"gte": "now",由于毫秒级粒度,无法缓存。在must子句中使用两个范围:一个with now/1h和另一个with,now以便第一个可以缓存一段时间,第二个用于在较小的结果集上加速精确过滤。


8

文档中所述:

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

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

换句话说,结果必须must子句中存在的所有查询匹配(如果没有must子句,则至少should子句之一匹配)。

由于您希望结果满足所有查询,因此应使用must


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


10
我认为您的意思是“必须使用必须”而不是“您应该使用必须” ;-)
jarmod
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.