2016-09-16 180 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