如何在弹性搜索中获取数组中所有对象都具有特定值的所有文档
假设我想获取数组字段中所有元素的“状态”不是未知的所有文档,
例如:
[
{
"type": "object1",
"list": [
{
"node": "1",
"status": "UP"
},
{
"node": "2",
"status": "DOWN"
},
{
"node": "3",
"status": "UNKNOWN"
}
]
},
{
"type": "object2",
"list": [
{
"node": "1",
"status": "UNKNOWN"
},
{
"node": "2",
"status": "UNKNOWN"
}
]
}
]
查询应仅返回“object1”文档,因为“object2”列表的所有元素均为未知。
映射,我已将其定义为嵌套对象,并且我已经可以搜索 list.status=UP 的记录,例如 只是想知道如何实现获取文档的用例,其中数组字段中的所有元素都不是某个值
尝试过这个
{
"query": {
"bool" : {
"must_not" : {
"term" : { "list.status" : "UNKNOWN" }
}
}
}
}
但是上面的查询在这种情况下不会返回object1(不是预期的),而是过滤掉object2(如预期的)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的问题是,即使嵌套文档之一匹配,也会返回完整的外部文档。您想要的是当所有嵌套文档匹配时,只有您想返回外部文档。
为此,文档建议
must_not
。尝试删除具有“未知”的文档,然后您将只得到“向上”和“向下”:
关于您的更新:您有相反的想法。对于嵌套字段,关联是完整的。对于数组字段的普通对象,关联会丢失。这就是嵌套类型存在的原因。 链接
Your problem is that even if one of the nested doc matches, the compete outer doc is returned. What you want is when all the nested docs match then only you want to return the outer doc.
For this, the documentation suggests
must_not
.Try to remove the docs which have "UNKNOWN" and then you will get only with "UP" and "DOWN":
Regarding you update: You have the opposite idea. With nested fields the association is intact. With a normal object of array field, the association is lost. That is why nested type exists. Link