如何通过对象键而不是对象 属性 使用 Elastic Search 嵌套查询
how to use Elastic Search nested queries by object key instead of object property
按照 this article 中的 Elastic Search 示例进行嵌套查询,我注意到它假定嵌套对象位于 ARRAY 内并且查询基于某个对象 属性:
{
nested_objects: [ <== array
{ name: "x", value: 123 },
{ name: "y", value: 456 } <== "name" property searchable
]
}
但是,如果我希望将嵌套对象排列在随新对象更新的键值结构中,并且我想按 KEY 进行搜索怎么办?示例:
{
nested_objects: { <== key-value, not array
"x": { value: 123 },
"y": { value: 456 } <== how can I search by "x" and "y" keys?
"..." <=== more arbitrary keys are added now and then
]
}
谢谢!
您可以尝试使用 query_string
查询来执行此操作,如下所示:
GET my_index/_search
{
"query": {
"query_string": {
"query":"nested_objects.\*.value:123"
}
}
}
它将尝试匹配 nested_objects
的任何子字段的 value
字段。
好的,所以我在一些 ES 见解之后的最终解决方案如下:
1. 我的对象键 "x"、"y"、... 是任意的这一事实导致我的索引映射混乱。所以一般来说,规划这种结构并不是一个好的 ES 实践......所以为了映射,我求助于 "Weighted tags" 文章中描述的结构:
{ "name":"x", "value":123 },
{ "name":"y", "value":456 },
...
这意味着,当需要更新名为 "x" 的子对象的值时,我很难(也更慢)找到它:我首先需要要查询整个顶级对象,遍历子对象直到找到一个名为 "x" 的对象,然后更新其值。然后我将整个子对象数组更新回 ES.
如果我有多个进程更新同一个索引,上述方法也会导致并发问题。 ES 具有乐观锁定,我可以在需要时使用它来重试,或者,我可以将更新排队并串行处理它们
按照 this article 中的 Elastic Search 示例进行嵌套查询,我注意到它假定嵌套对象位于 ARRAY 内并且查询基于某个对象 属性:
{
nested_objects: [ <== array
{ name: "x", value: 123 },
{ name: "y", value: 456 } <== "name" property searchable
]
}
但是,如果我希望将嵌套对象排列在随新对象更新的键值结构中,并且我想按 KEY 进行搜索怎么办?示例:
{
nested_objects: { <== key-value, not array
"x": { value: 123 },
"y": { value: 456 } <== how can I search by "x" and "y" keys?
"..." <=== more arbitrary keys are added now and then
]
}
谢谢!
您可以尝试使用 query_string
查询来执行此操作,如下所示:
GET my_index/_search
{
"query": {
"query_string": {
"query":"nested_objects.\*.value:123"
}
}
}
它将尝试匹配 nested_objects
的任何子字段的 value
字段。
好的,所以我在一些 ES 见解之后的最终解决方案如下: 1. 我的对象键 "x"、"y"、... 是任意的这一事实导致我的索引映射混乱。所以一般来说,规划这种结构并不是一个好的 ES 实践......所以为了映射,我求助于 "Weighted tags" 文章中描述的结构:
{ "name":"x", "value":123 },
{ "name":"y", "value":456 },
...
这意味着,当需要更新名为 "x" 的子对象的值时,我很难(也更慢)找到它:我首先需要要查询整个顶级对象,遍历子对象直到找到一个名为 "x" 的对象,然后更新其值。然后我将整个子对象数组更新回 ES.
如果我有多个进程更新同一个索引,上述方法也会导致并发问题。 ES 具有乐观锁定,我可以在需要时使用它来重试,或者,我可以将更新排队并串行处理它们