ElasticSearch:单查询实现嵌套数组空值与指定值检索
单个Elasticsearch查询实现多条件检索需求
文档结构
{ "hits": [ { "_type": "_doc", "_id": "ef0a2c44179a513476b080cc2a585d95", "_source": { "DIVISION_NUMBER": 44, "MATCHES": [ { "MATCH_STATUS": "APPROVED", "UPDATED_ON": 1599171303000 } ] } }, { "_type": "_doc", "_id": "ef0a2c44179a513476b080cc2a585d95", "_source": { "DIVISION_NUMBER": 44, "MATCHES": [ ] } } ] }
需求说明
MATCHES为嵌套数组,内部包含文本字段MATCH_STATUS(可选值如"APPROVED"、"REJECTED"等)。需要用单个Elasticsearch查询检索满足以下任一条件的文档:
- MATCHES数组中存在
MATCH_STATUS为"APPROVED"或"RECOMMENDED"的元素; - MATCHES为空数组(即
"MATCHES": [ ])。
合并后的单个查询
通过bool查询的should子句组合两个条件,实现逻辑“或”的关系:
{ "size": 5000, "from": 0, "query": { "bool": { "should": [ // 条件1:匹配MATCHES数组中含指定状态的文档 { "nested": { "path": "MATCHES", "query": { "terms": { "MATCHES.MATCH_STATUS.keyword": [ "APPROVED", "RECOMMENDED" ] } } } }, // 条件2:匹配MATCHES为空数组的文档 { "bool": { "must_not": [ { "nested": { "path": "MATCHES", "query": { "exists": { "field": "MATCHES" } } } } ] } } ], "minimum_should_match": 1 } } }
查询解释
should子句:包含两个待匹配条件,满足其中一个即可返回文档;minimum_should_match: 1:显式声明需至少满足一个should条件(无must/filter时默认值为1,显式写更清晰);- 第一个
should分支:用nested查询穿透嵌套数组,匹配状态符合要求的文档; - 第二个
should分支:通过must_not + nested exists组合,筛选出MATCHES为空数组的文档。
内容的提问来源于stack exchange,提问作者Kunwar Shukla
相关产品推荐
相关产品推荐

