Elastic Search嵌套数组多条件查询问题:jsonValue匹配失效求助
Elasticsearch嵌套数组查询问题解决
索引结构
{ "_index": "example-index", "_type": "_doc", "_id": "C-123", "_version": 1685532751615, "_seq_no": 123, "_primary_term": 16, "found": true, "_source": { "definitionKey": "example.definition", "definitionName": "example", "startTime": "2023-05-31T11:32:31.526Z", "id": "C-123", "state": "active", "variables": [ { "id": "VAR-d4a01b91-ffa6-11ed-83be-560acee90493", "name": "skills", "jsonValue": [ "Skill 1" ] } ], "definitionId": "C-456", "tenantId": "" } }
查询需求
需要匹配同时满足以下三个条件的文档:
- definitionKey精确等于
example.definition - variables数组中存在name精确匹配为
skills的元素 - 上述匹配的variables元素的jsonValue数组至少包含一个精确匹配为
Skill 1的条目
错误查询语句
之前尝试的查询无法匹配第三个条件,语句如下:
{ "query": { "bool": { "must": [ { "term": { "definitionKey": "example.definition" } }, { "nested": { "path": "variables", "query": { "bool": { "must": [ { "term": { "variables.name": "skills" } }, { "nested": { "path": "variables", "query": { "terms": { "variables.jsonValue.keyword": [ "Skill 1" ] } } } } ] } } } } ] } } }
问题分析
错误原因在于重复使用了nested查询:已经在最外层指定了path: variables,此时查询上下文是variables数组的单个元素,再次嵌套nested查询(path仍为variables)完全多余。这种写法会让查询逻辑变成“存在一个variables元素name为skills,且存在任意一个variables元素jsonValue包含Skill 1”,而非要求“同一个variables元素同时满足name为skills且jsonValue包含Skill 1”。
正确查询语句
只需要在同一个nested查询的bool条件中,同时匹配variables.name和variables.jsonValue.keyword即可:
{ "query": { "bool": { "must": [ { "term": { "definitionKey": "example.definition" } }, { "nested": { "path": "variables", "query": { "bool": { "must": [ { "term": { "variables.name": "skills" } }, { "term": { "variables.jsonValue.keyword": "Skill 1" } } ] } } } } ] } } }
说明
- 指定
path: variables的nested查询,会将内部的查询逻辑作用在variables数组的单个元素上 - 将两个条件放在同一个
bool.must下,确保是同一个variables元素同时满足name匹配和jsonValue匹配 - 因为是精确匹配,使用
term查询即可;如果需要匹配多个值,可替换为terms查询
内容的提问来源于stack exchange,提问作者flosam
相关产品推荐
相关产品推荐

