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

问题描述

我正在尝试对我知道运行正常的本地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
    },"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","col": 67
    }
  },"status":400
}

注意:错误中列出的行号和列号将不正确,因为我已经对查询进行了格式化以提高可读性,原始查询除了查询字符串中没有空格之外,没有其他空格。 / p>

我通读了Elasticsearch API的官方文档,试图找出我做错了什么,并且发现一些人在网上遇到了类似的解析错误,而这些错误与他们的错误无关,并且显然没有与之相关的问题。空值搜索参数,因此我正在努力找出问题所在。在没有空值参数的情况下运行相同的查询似乎可以正常工作,因此我可能认为我认为它们通常不是Elasticsearch解析/忽略的问题是错误的?话虽如此,错误消息说明无法解析布尔查询中的“必须”这一事实表明"filter": null行已正确解析,因此空值应该可以...

解决方法

查询中绝对不能包含空值。您应该修改查询生成器,使其从不添加,因为ES解析它们时会抱怨,如您所见。

如果您查询的查询中没有任何单个null值,则说明它可以正常工作。现在只需添加"filter": null,看看会发生什么。是的,它失败了!

因此,只需修改查询生成器,就可以了。

此外,两个花括号之间只能有一个约束。以下部分永远不能同时使matchmatch_phrasequery_stringrange不为空。每个约束都应在自己的{...}

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...