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