如何通过对象键而不是对象属性使用Elastic Search嵌套查询

时间:2018-08-16 08:09:30

标签: elasticsearch nested-queries

this article中的Elastic Search示例为例,对于嵌套查询,我注意到它假定嵌套对象位于ARRAY内,并且查询基于某些对象PROPERTY:

{
    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
    ]
}

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

好的,所以我对ES的一些见解之后的最终解决方案如下: 1.我的对象键“ x”,“ y”,...是任意的事实在索引映射中造成混乱。因此,总的来说,计划这种结构不是一种良好的ES做法...因此,为了进行映射,我求助于“加权标签”文章中描述的结构:

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

  2. 在有多个进程更新同一索引的情况下,上述方法也会导致并发问题。 ES具有乐观锁定功能,可以在需要时重试,或者可以将更新排队并按顺序处理