-1

我用 ruby​​ 编写了一个 API,可以帮助客户构建 elasticsearch 查询 dsl。构建的查询包含一个空布尔值,如下所示,这会导致问题。由于 bool 像这样为空,它会导致返回 0 个结果。如果我删除布尔值,我会得到预期的结果。如何在不删除该布尔值的情况下将其变成 match_all ?我需要将 bool 留在那里,直到下一个版本可以将其删除。如果我在默认情况下在 bool 中添加一个 must 并在其中添加 match_all,我觉得它可能会产生意想不到的结果。

弹性版本:1.0.1

{
    "query": {
        "filtered": {
            "query": {
                "bool": {} <--- Causing problems
            },
            "filter": {
                "query": {
                    "query_string": {
                        "fields": [
                            [
                                "name_field",
                                "message_field"
                            ]
                        ],
                        "query": "Halo AND Yaylo"
                    }
                }
            }
        }
    },
    "sort": [
        {
            "interactions": {
                "order": "desc"
            }
        }
    ]
}
4

1 回答 1

0

这种行为在https://github.com/elastic/elasticsearch/issues/7240中发生了变化,这意味着从 ES 版本 1.3.3、2.0 和 1.4 开始。

同时,如果您可以阅读以下关于以下内容的声明bool

默认情况下,不需要任何 should 子句匹配,但有一个例外:如果没有 must 子句,则至少有一个 should 子句必须匹配。

然后你可以在你的must

        {
          "constant_score": {
            "filter": {
              "query": {"match_all": {}}
            },
            "boost": 0
          }
        }

有一个无伤大雅的(从得分的角度来看)must陈述。

于 2015-08-05T00:01:42.303 回答