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

use*_*667 136 elasticsearch

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

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

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

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

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
Run Code Online (Sandbox Code Playgroud)

Uts*_*awn 202

必须表示:子句(查询)必须出现在匹配的文档中.这些子句必须匹配,就像逻辑AND一样.

应该意味着:这些子句中至少有一个必须匹配,就像逻辑OR一样.

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

现在在bool查询中:

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

应该意味着:如果这些条款匹配,它们会增加_score; 否则,它们没有效果.它们仅用于优化每个文档的相关性分数.


是的你可以在里面使用多个过滤器must.

  • 我认为您需要使用`minimum_number_should_match = 1`来强制执行"至少其中一个条款必须匹配"的想法. (4认同)
  • 这个答案应该是doc的一部分! (3认同)
  • JimK - 或没有必须条款。当没有must子句时,隐含minimum_number_should_match。 (3认同)

Hes*_*oon 13

正如文档中所说:

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

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

换句话说,结果必须由匹配所有查询呈现在条款(或匹配的至少一个所述的应该子句如果没有必须的子句。

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


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

  • 我认为您的意思是“您必须使用 must”而不是“您应该使用 must”;-) (20认同)
  • 我希望它被称为“any”而不是“should”:(这样就不会那么含糊了 (6认同)

Tau*_*kas 13

由于这是一个很受欢迎的问题,我想补充一点,在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以便第一个可以缓存一段时间,第二个用于精确过滤在较小的结果集上加速.