Elasticsearch如何实现数组所有元素均匹配指定参数的查询
Elasticsearch 数组全元素匹配查询实现方案
核心逻辑
要实现「数组内所有值都等于给定参数才返回文档」的需求,本质是同时满足两个过滤条件:
- 数组中至少存在1个等于目标值的元素(避免空数组被误匹配)
- 数组中不存在任何不等于目标值的元素
适用嵌套对象数组的实现(你的示例场景)
你的示例中数组元素是包含ticketType字段的对象,需要先确保索引映射中该数组字段为nested类型,再使用如下DSL查询:
{ "query": { "bool": { "must": [ // 匹配至少存在一个ticketType=10的元素 { "nested": { "path": "你的数组字段名", "query": { "term": { "你的数组字段名.ticketType": 10 } } } } ], "must_not": [ // 排除存在任何ticketType不等于10的元素 { "nested": { "path": "你的数组字段名", "query": { "bool": { "must_not": { "term": { "你的数组字段名.ticketType": 10 } } } } } } ] } } }
注意将上述DSL中的
你的数组字段名替换为你实际存储嵌套对象的数组字段名称即可。
适用普通数值数组的实现
如果你的ticketType本身就是普通数值数组(例如ticketType: [10, 10]),可以直接使用如下更简单的DSL:
{ "query": { "bool": { "must": { "term": { "ticketType": 10 } }, "must_not": { "range": { "ticketType": { "gt": 10, "lt": 10 } } } } } }
效果验证
针对你给出的两个测试文档:
- objectOne包含
ticketType=20的元素,会被must_not条件过滤 - objectTwo所有元素的
ticketType都等于10,会正常返回
完全符合你的查询要求。
内容的提问来源于stack exchange,提问作者Y.Y.
相关产品推荐
相关产品推荐

