在ES中MUST和SHOULD bool查询的区别是什么?

如果我只想要包含我的条款的结果,我应该使用必须?

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

Also

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

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

如文件中所述:

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

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

因为希望结果满足所有查询,所以应该使用must。


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


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

should的意思是:这些子句中至少有一个必须匹配,就像逻辑或。

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

现在在bool查询中:

must的意思是:必须与要包含的文档相匹配的子句。

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


是的,你可以在内部使用多个过滤器。


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

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

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

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

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