Elasticsearch 查询可以有空值参数吗?

Can Elasticsearch queries have null-valued parameters?

我正在尝试 运行 针对我知道运行正常的本地 Elasticsearch 实例执行以下查询,但是由于查询显然格式错误,我收到了 400 错误:

{
  "size": 10,
  "from": 0,
  "query": {
    "bool": {
      "filter": null,
      "must": [
        {
          "bool": null,
          "match": null,
          "match_phrase": null,
          "query_string": {
            "default_field": "name",
            "query": "Test Name"
          },
          "range": null
        }
      ],
      "must_not": null,
      "should": null
    },
    "match": null,
    "match_phrase": null,
    "query_string": null,
    "range": null
  }
}

注意: 有一堆空值参数,因为查询是根据自定义 OpenAPI 规范自动生成的 - 这些参数应该被 Elasticsearch 忽略,我 不是 试图通过任何空值字段查找或过滤。以这种方式使用空值参数是否存在问题?

具体报错信息如下:

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "[bool] query malformed, no start_object after query name",
        "line": 1,
        "col":67
      }
    ],
    "type": "x_content_parse_exception",
    "reason": "[1:67] [bool] failed to parse field [must]",
    "caused_by": {
      "type": "parsing_exception",
      "reason": "[bool] query malformed, no start_object after query name",
      "line": 1,
      "col": 67
    }
  },
  "status":400
}

注意:错误中列出的行号和列号将不准确,因为我已将查询格式化为可读性,原始查询除了在查询字符串。

我通读了官方 Elasticsearch API 文档,试图弄清楚我做错了什么,并且发现网上有些人有类似的解析错误,但他们的错误是无关的,而且他们显然没有特别是空值搜索参数有问题,所以我正在努力弄清楚这里出了什么问题。 运行 没有空值参数的相同查询似乎有效,所以也许我错误地认为它们通常不应该成为 Elasticsearch 到 parse/ignore 的问题?话虽如此,错误消息说未能在 bool 查询中解析 'must' 这一事实表明 "filter": null 行已被正确解析,因此空值应该没问题...

您的查询中永远不应有空值。你应该修改你的查询生成器,不要添加它们,因为 ES 在解析它们时会报错,正如你所看到的。

如果您在没有任何空值的情况下进行查询,您就会发现它有效。现在只需添加 "filter": null,看看会发生什么。对,失败了!

所以只需修改您的查询生成器就可以了。

此外,两个大括号之间只能有一个约束。下面的部分永远不能有matchmatch_phrasequery_stringrange同时为non-null。这些约束中的每一个都应该在自己的部分 {...}

    {
      "bool": null,
      "match": null,
      "match_phrase": null,
      "query_string": {
        "default_field": "name",
        "query": "Test Name"
      },
      "range": null
    }