OpenSearch复杂条件结合嵌套文档数组查询可行性咨询
需求实现说明
你的需求完全可以实现,但需要根据references字段的映射类型调整查询写法:
情况1:references为普通对象数组(非nested类型)
你提供的query_string查询写法直接有效,能正确匹配到以下两类主文档:
- 满足主文档条件:
(tag:'1' AND author:('A' OR 'B')) OR (tag:'2' AND author:('A' OR 'C')) - 满足引用数组条件:数组中存在任意一个引用的
bookId=7,或存在任意一个引用的publisher='weird press'
对应的查询代码如下:
POST books/_search { "query": { "query_string": { "query": "(tag:'1' AND author:('A' OR 'B')) OR (tag:'2' AND author:('A' OR 'C')) OR references[*].bookId: 7 OR references[*].publisher: 'weird press'" } } }
情况2:references为nested类型
如果references字段被映射为nested类型(用于避免对象数组扁平化导致的跨对象匹配问题),直接使用references[*].xxx的写法会失效,需要用nested查询包裹引用相关的条件。示例查询如下:
POST books/_search { "query": { "bool": { "should": [ { "query_string": { "query": "(tag:'1' AND author:('A' OR 'B')) OR (tag:'2' AND author:('A' OR 'C'))" } }, { "nested": { "path": "references", "query": { "query_string": { "query": "references.bookId:7 OR references.publisher:'weird press'" } } } } ] } } }
补充说明
- 普通对象数组的扁平化存储会将数组中所有对象的字段值合并存储,因此如果你的需求是只要数组中存在任意一个字段满足条件,普通数组的写法完全可行;
- 若
references是nested类型,必须通过nested查询指定路径,才能正确匹配数组中的单个对象。
内容的提问来源于stack exchange,提问作者user2173353
相关产品推荐
相关产品推荐

