在弹性搜索中删除/添加嵌套对象

tkj*_*kja 5 json elasticsearch kibana

我在Elastic 手册中找不到关于嵌套对象的示例,说明如何在 Kibana Sense 中使用 RESTful 命令修改文档的字段和嵌套对象。我在这里寻找类似于 Solrs原子更新的东西,它允许更新文档的特定字段。

Kibana Sense 中的 RESTful 命令如何实现这一点?我能找到的手册中唯一相关信息是Partial Updates to Documents,但我不知道如何将其应用于此用例。

例如,直接来自Elastic 文档

PUT my_index
{
"mappings": {
    "my_type": {
    "properties": {
        "user": {
        "type": "nested" 
        }
    }
    }
}
}

PUT my_index/my_type/1
{
"group" : "fans",
"user" : [
    {
    "first" : "John",
    "last" :  "Smith"
    },
    {
    "first" : "Alice",
    "last" :  "White"
    }
]
} 
Run Code Online (Sandbox Code Playgroud)

如何删除嵌套对象中的条目,使文档“1”看起来像:

{
"group" : "fans",
"user" : [
    {
    "first" : "John",
    "last" :  "Smith"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

如何在嵌套对象中添加条目,使文档“1”看起来像:

{
"group" : "fans",
"user" : [
    {
    "first" : "John",
    "last" :  "Smith"
    },
    {
    "first" : "Alice",
    "last" :  "White"
    },
    {
    "first" : "Peter",
    "last" :  "Parker"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*hil 0

除非我误解了你的要求,否则你每次只需将更新的文档版本发布到同一个文档 ID 即可。

要删除嵌套文档(或任何字段):

PUT my_index/my_type/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
} 
Run Code Online (Sandbox Code Playgroud)

要添加用户,请将其添加到列表中:

PUT my_index/my_type/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "Alice",
      "last" :  "White"
    },
    {
      "first" : "Peter",
      "last" :  "Parker"
    }
  ]
} 
Run Code Online (Sandbox Code Playgroud)

注意:elasticsearch 中的文档是不可变的。对单个字段进行更改会导致整个文档重新索引。嵌套文档始终会使用父文档重新索引,因此如果您更改父文档中的字段,嵌套文档也会重新索引。如果嵌套文档很大并且父文档经常更改,这可能会成为性能问题。