Elasticsearch如何用bodybuilder查询含指定nested id的有效实体
解决方案
1. 基础查询逻辑说明
nested类型是Elasticsearch中专门用于存储对象数组的特殊类型,每个嵌套对象都会被作为独立的隐藏文档存储,因此必须通过nested查询才能匹配到嵌套对象内的字段值,普通的直连字段查询无法命中nested类型的内部属性。
你需要的查询需要同时满足两个过滤条件,因此放在bool.must查询组合中即可:
- 文档顶层字段
isActive值为true - 嵌套字段中至少存在一个子项的
id属性为anomaly
2. Elasticsearch 原生DSL示例
{ "query": { "bool": { "must": [ { "term": { "isActive": true } }, { "nested": { "path": "replace_with_your_nested_field_name", "query": { "term": { "replace_with_your_nested_field_name.id": "anomaly" } } } } ] } } }
注意:请将代码中的
replace_with_your_nested_field_name替换为你的索引mapping中实际定义的nested类型字段名,嵌套内部属性查询必须带上完整的字段路径。如果你的id字段配置了keyword类型子字段,需要将查询字段修改为replace_with_your_nested_field_name.id.keyword避免text类型分词导致匹配失败。
3. bodybuilder 构造代码(Node.js 环境)
const bodybuilder = require('bodybuilder') // 构造查询体 const esQueryBody = bodybuilder() // 匹配顶层isActive为true .query('term', 'isActive', true) // 嵌套查询匹配子项id为anomaly .query('nested', { path: 'replace_with_your_nested_field_name' }, (nestedQuery) => { return nestedQuery.query('term', 'replace_with_your_nested_field_name.id', 'anomaly') }) // 生成最终DSL .build() // 直接将esQueryBody传入Elasticsearch客户端的search方法即可
内容的提问来源于stack exchange,提问作者Linkx_lair
相关产品推荐
相关产品推荐

