【问题标题】:Elasticsearch difference between MUST and SHOULD bool queryElasticsearch MUST 和 SHOULD bool 查询之间的区别
【发布时间】:2015-04-30 08:30:21
【问题描述】:

ES中MUSTSHOULDbool查询有什么区别?

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

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

还有

我可以在一个必须使用多个过滤器,如下面的代码:

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

【问题讨论】:

  • 不知道为什么他们就是不能让它成为常用的 linq/lambda 表达式样式,而是引入了这么多的复杂性。

标签: elasticsearch


【解决方案1】:

documentation中所说:

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

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

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

既然你希望你的结果满足所有的查询,你应该使用must


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

【讨论】:

  • 我认为你的意思是“你必须使用 must”而不是“你应该使用 must”;-)
【解决方案2】:

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

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

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

现在在bool query

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

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


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

【讨论】:

  • 聚会有点晚了,但是must 用于类别或定价,should 用于属性,例如尺寸和颜色。现在,如果选择了 L 和 XL 码,则应该介于这两者之间,但如果还选择了绿色,则它必须是(L 码或 XL 码)和(绿色)的必备品。这可能吗?
  • 我相信在这种情况下 filters 可能是属性的更好方法。它们面向精确匹配而不是基于相关性的搜索。有关详细信息,请参阅文档中的 queries and filters
  • 我认为您需要有minimum_number_should_match = 1 才能强制执行“这些子句中至少有一个必须匹配”的想法。
  • 好答案!我只想分享对我理解这一点非常有帮助的文档的一部分。 elastic.co/guide/en/elasticsearch/guide/current/…
  • JimK - 或者没有必须条款。如果没有 must 子句,则隐含 minimum_number_should_match。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2019-06-08
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2022-01-20
    • 2020-05-01
    相关资源
    最近更新 更多