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

时间:2016-09-16 20:17:27

标签: json elasticsearch kibana

我在Elastic manual on nested objects中找不到如何使用Kibana Sense中的RESTful命令修改文档的字段和嵌套对象的示例。我在这里寻找与Solrs atomic updates类似的东西,它允许更新文档的特定字段。

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

例如,直接来自Elastic docs

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

如何删除嵌套对象中的条目,以便文档" 1"看起来像:

{
"group" : "fans",
"user" : [
    {
    "first" : "John",
    "last" :  "Smith"
    }
]
}

如何在嵌套对象中添加条目,以便文档" 1"看起来像:

{
"group" : "fans",
"user" : [
    {
    "first" : "John",
    "last" :  "Smith"
    },
    {
    "first" : "Alice",
    "last" :  "White"
    },
    {
    "first" : "Peter",
    "last" :  "Parker"
    }
]
}

2 个答案:

答案 0 :(得分:2)

除非您要获取所有嵌套对象,然后添加/删除项目并为它们重新编制索引,否则必须使用脚本更新,这是先前提出的答案。但是,如果您有很多嵌套文档,则应该进行部分更新/添加和删除。从数据传输和索引的角度来看,它要快得多。

这是一篇很好的文章,介绍了如何进行脚本化更新:

https://iridakos.com/programming/2019/05/02/add-update-delete-elasticsearch-nested-objects

答案 1 :(得分:0)

除非我误解您的提问,否则您只需在每次需要时将更新的文档版本发布到相同的文档ID。

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

PUT my_index/my_type/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
} 

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

PUT my_index/my_type/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "Alice",
      "last" :  "White"
    },
    {
      "first" : "Peter",
      "last" :  "Parker"
    }
  ]
} 

注意:Documents in elasticsearch are immutable。对单个字段进行更改会导致整个文档重新编制索引。嵌套文档始终使用父文档重新编制索引,因此,如果更改父文档中的字段,则嵌套文档也将重新编制索引。如果嵌套文档很大且父级经常更改,则这可能是性能问题。