AWS OpenSearch嵌套数组字段Range Query匹配问题求助
解决AWS OpenSearch嵌套数组的同条目匹配问题
你的问题核心是没有利用nested类型的查询语法,普通的bool查询会跨数组元素匹配条件,导致两个range分别命中不同的hours条目时也会返回文档。要让两个条件必须匹配数组中的同一个条目,必须用nested查询来包裹你的条件。
正确的查询语句
GET hc_index/_search { "query": { "bool": { "must": [ { "nested": { "path": "hours", "query": { "bool": { "must": [ { "range": { "hours.open": { "lte": 1230 } } }, { "range": { "hours.close": { "gte": 1230 } } } ] } } } } ] } }, "from": 0, "size": 10 }
原理说明
- 因为你的
hours字段定义为nested类型,数组中的每个对象都会被当成独立的子文档存储。 - 普通的跨字段查询会忽略子文档的边界,只要数组里存在任意一个元素满足
open<=1230,同时存在任意一个元素满足close>=1230,就会匹配文档。 - 用
nested查询并指定path: "hours"后,内部的bool.must条件会强制要求同一个子文档(即同一个hours条目)同时满足两个range条件。
针对你说的1230这个时间:
- 第一个hours条目:
close=1200 < 1230,不满足close>=1230 - 第二个hours条目:
open=1300 > 1230,不满足open<=1230
所以没有子文档同时符合两个条件,查询就不会返回该文档。
关于你之前的尝试
你直接在must下用minimum_should_match无效,是因为那是针对普通的bool查询,没有关联到nested子文档的边界,必须把条件放到nested查询内部的bool里才能生效。
内容的提问来源于stack exchange,提问作者user1854458
相关产品推荐
相关产品推荐

