MUST和SHOULD bool查询之间的弹性差异

时间:2015-02-27 15:13:02

标签: elasticsearch

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

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

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

同时

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

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

3 个答案:

答案 0 :(得分:160)

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

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

基本上它们像逻辑运算符AND和OR一样使用。请参阅this

现在在bool query

必须表示:必须匹配要包含的文档的条款。

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


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

答案 1 :(得分:12)

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

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

如果您不关心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,以便第一个可以缓存一段时间,第二个用于精确过滤,在较小的结果集上加速。

答案 2 :(得分:3)

documentation中所述:

  

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

     

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

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

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


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