问题描述
我正在尝试对我知道运行正常的本地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
,看看会发生什么。是的,它失败了!
因此,只需修改查询生成器,就可以了。
此外,两个花括号之间只能有一个约束。以下部分永远不能同时使match
,match_phrase
,query_string
和range
不为空。每个约束都应在自己的{...}
{
"bool": null,"match": null,"match_phrase": null,"query_string": {
"default_field": "name","query": "Test Name"
},"range": null
}