有没有办法让elasticsearch只返回具有以下内容的文档all他们的嵌套对象符合某些标准吗?假设我有以下人为的示例:
"mappings": {
"person": {
"properties": {
"name": { "type": "string" },
"other_info": ...
"pet": {
"type": "nested",
"properties": {
"gender": { "type": "string" },
"age": { "type": "integer" },
"name": { "type": "string" },
"other_info": ...
}
}
}
}
}
在这种情况下,我将如何搜索养有宠物的人all年龄大于 5 岁?我还想搜索与宠物无关的其他属性,但为了简单起见,我们假设不是这样。如果一个人养了三只宠物,但其中只有一两只超过 5 岁,我不希望它成为搜索结果。
我找不到任何有关如何执行此操作的信息,因此我考虑了一个我不太喜欢的替代解决方案。不要使用嵌套文档,而是为宠物建立一个单独的索引,并将人员 ID 作为属性(可能带有_parent
场地?)。然后我可以执行以下操作:
- 搜索5岁以上的宠物,得到结果宠物列表
- 在应用程序端,按人员 ID 对列表中的宠物进行分组
- 计算每组中的宠物数量,如果与该人拥有的宠物总数相匹配,则将该人 ID 添加到列表中
- 根据 ID 以及我想要检查的任何其他特定于人员的属性对人员索引进行另一次搜索
不过,这似乎是一种非常迂回的方式,而且如果我走这条路,我需要在查询人员索引之前知道每个人拥有的宠物总数(比如将其存储为每个宠物的属性,但是这只会让事情变得非常混乱)或者通过搜索所有拥有至少一只匹配宠物的人,并将宠物数量提前存储在人员索引中(或使用脚本过滤器 https://stackoverflow.com/questions/15543308/elasticsearch-filtering-by-the-size-of-a-field-that-is-an-array?),然后检查计数是否匹配。
我碰到这个 github 问题 https://github.com/elasticsearch/elasticsearch/issues/3022#issuecomment-18705079(添加“每次点击返回匹配的嵌套内部对象”功能)这确实很有用,但不幸的是它尚未实现。
当然有更好的方法来做到这一点吗?
为什么不使用一个must_not
条款。如果我是你,我会搜索养有 5 岁以上宠物的人bool
过滤器must_not
搜索养有 5 岁以下宠物的人的子句。
像这样:
"filter" : {
"bool" : {
"must" : {
"nested" : {
"path" : "person.pet",
"filter" : {
"range" : {
"person.pet.age" : { "from" : 5 }
}
}
}
},
"must_not" : {
"nested" : {
"filter" : {
"range" : {
"person.pet.age" : { "lte" : 5 }
}
}
}
}
}
}
我在这里所做的首先是收集所有至少拥有一只 5 岁以上宠物的人(其中包括拥有多只宠物的人,其中一些宠物还很小)。然后,我排除所有养有 5 岁或以下宠物的人,留下所需的结果。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)