【问题标题】:how to use Elastic Search nested queries by object key instead of object property如何通过对象键而不是对象属性使用 Elastic Search 嵌套查询
【发布时间】:2018-08-18 20:57:48
【问题描述】:

按照 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
    ]
}

谢谢!

【问题讨论】:

  • nested_objects.x.value: 123简单搜索
  • 这不是我需要的。注意我写了“任意键”,即我事先不知道“x”和“y”或任何其他键实际上存在。我试图回答这个问题:“让所有对象都包含与某个术语匹配的嵌套对象的键”

标签: elasticsearch nested-queries


【解决方案1】:

您可以尝试使用query_string 查询来执行此操作,如下所示:

GET my_index/_search 
{
  "query": {
    "query_string": {
      "query":"nested_objects.\\*.value:123"
    }
  }
}

它将尝试匹配nested_objects的任何子字段的value字段。

【讨论】:

  • 这不是我要找的:我事先不知道值“123”。我试图仅通过“x”或“y”查询,然后在我的评分函数中使用它们的“值”
【解决方案2】:

好的,所以我在一些 ES 见解之后的最终解决方案如下: 1. 我的对象键“x”、“y”……是任意的这一事实导致我的索引映射混乱。所以一般来说,规划这种结构并不是一个好的ES实践……所以为了映射,我求助于“Weighted tags”文章中描述的结构:

{ "name":"x", "value":123 },
{ "name":"y", "value":456 },
...
  1. 这意味着,当需要更新名为“x”的子对象的值时,我会更难(也更慢)找到它:我首先需要查询整个顶部-级别对象,遍历子对象,直到找到一个名为“x”的对象,然后更新其值。然后我将整个子对象数组更新回 ES。

  2. 如果我有多个进程更新同一个索引,上述方法也会导致并发问题。 ES 有乐观锁定,我可以在需要时重试,或者,我可以排队更新并串行处理它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多