2016-09-16 93 views
0

我无法在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" 
    } 
] 
} 

回答

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。对单个字段进行更改会导致整个文档重新编制索引。嵌套文档总是与父文档重新建立索引,所以如果您在父文档中更改了一个字段,嵌套文档也会被重新编制索引。如果嵌套文档很大并且父母的变化频繁,这可能是一个性能问题。

+0

我想在嵌套的“用户”对象中添加或删除,而不是重新索引一个新的(可能很大的)文档。我正在寻找类似于Solrs“原子更新”的东西,我更新了这个问题来澄清这一点。 – tkja

+0

您想要的是elasticsearch无法实现的。文件是不可变的。我调整了我的答案,包括一个关于这个的说明。您可能希望取消嵌套文档并通过某些应用程序逻辑链接它们。 – Phil

+0

那么https://www.elastic.co/guide/en/elasticsearch/guide/master/partial-updates.html#_updates_and_conflicts(部分更新文档)呢?这可以用来完成一个RESTful命令来直接更新,如我的例子? – tkja