gpt4 book ai didi

elasticsearch - 将所有嵌套对象与 elasticsearch 匹配

转载 作者:行者123 更新时间:2023-12-04 07:11:44 25 4
gpt4 key购买 nike

有没有办法让 elasticsearch 只返回其嵌套对象所有符合某些条件的文档?假设我有以下人为的例子:

"mappings": {                                                                                                                                                            
"person": {
"properties": {
"name": { "type": "string" },
"other_info": ...

"pet": {
"type": "nested",
"properties": {
"gender": { "type": "string" },
"age": { "type": "integer" },
"name": { "type": "string" },
"other_info": ...
}
}
}
}
}

在这种情况下,我将如何搜索拥有所有 5 岁以上宠物的人?我还想搜索与宠物无关的其他属性,但为简单起见,我们假设不是这样。如果一个人有三只宠物,但其中只有一两只超过 5 岁,我不希望它出现在搜索结果中。


我找不到关于如何执行此操作的任何信息,因此我考虑了一个我不太喜欢的替代解决方案。不使用嵌套文档,而是为宠物创建一个单独的索引,并将人员 ID 作为属性(可能带有 _parent 字段?)。然后我可以执行以下操作:

  • 搜索 5 岁以上的宠物,得到宠物列表作为结果
  • 在应用端,将列表中的宠物按人ID分组
  • 计算每组中宠物的数量,如果这与此人拥有的宠物总数相符,则将此人 ID 添加到列表中
  • 根据 ID 和我要检查的任何其他特定于人的属性对人员索引进行另一次搜索

虽然这似乎是一种非常迂回的方式,而且如果我走那条路,我需要在查询人员索引之前知道每个人拥有的宠物总数(比如将其存储为每个人的属性)宠物,但这只会让它变得非常困惑)或者通过搜索所有至少有一只匹配宠物的人,提前将宠物数量存储在人员索引中(或使用 script filter ?),然后检查是否计数匹配。

我遇到了 this github issue (添加“每次点击返回匹配的嵌套内部对象”功能)这本来是非常有用的,但不幸的是它还没有实现。

肯定有更好的方法吗?

最佳答案

为什么不使用 must_not 子句。如果我是你,我会在 bool 过滤器中搜索拥有 5 岁以上宠物的人,并使用 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 岁或以下宠物的人排除在外,留下所需的结果。

祝你好运!

关于elasticsearch - 将所有嵌套对象与 elasticsearch 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com