2015-08-20 57 views
2

我有包含my_array此特定對象:ElasticSearch嵌套陣列部分更新

"description": "My Object Description", 
"my_array": [ 
    { 
    "id": 1000, 
    "name": "abc", 
    "url" : "abc.html", 
    "content": "somebig content" 
    }, 
    { 
    "id": 1001, 
    "name": "def", 
    "url" : "def.html", 
    "content": "somebig content" 
    }, 
    { 
    "id": 1002, 
    "name": "xyz", 
    "url" : "xyz.html", 
    "content": "somebig content" 
    } ] 

每個元素在數組包含一個URL。現在每當這個對象發生變化時,我有一個任務會觸發數組中的每個元素的url,獲取該元素的html內容,並創建可以被索引到elasticsearch中的請求文檔。

可以說,id = 1001的url不可訪問,並且此元素的內容無法訪問。我還是想繼續和元素1000過程中的變化,和1002在這種情況下我的更新應該是這樣的:

"description": "My New Object Description", 
    "my_array": [ 
     { 
     "id": 1000, 
     "name": "abc", 
     "url" : "abc-new-url.html", 
     "content": "some modified content" 
     }, 
     { 
     "id": 1002, 
     "name": "xyz", 
     "url" : "xyz-new-url.html", 
     "content": "some modified content" 
     } ] 

如果我送這部分更新elasticsearch,收集得到更新,但元素1001從集合中刪除。

我的問題是我如何選擇性地更新元素1000和1002而不碰觸1001.索引陳舊與1001在這裏對我來說沒問題。一個明顯的選擇是從elasticsearch獲取現有的文檔,並在進行更新之前手動進行合併。有沒有其他方式可以執行此部分更新?

另一個問題,有沒有什麼辦法只發送url到elasticsearch,並編寫一個插件在索引時間獲取html內容,而不是事先做這件事?

回答

-1

您無法使用Elasticsearch本機API進行此類更新。但是,如果您不想在應用程序級別手動合併更新的內容,則可能的解決方案是將數組中的每個元素存儲在與原始文檔具有相同索引但文檔類型不同的文檔中。

然後做這些元素中的每一個(在這種情況下變得文檔)分別

+0

這可以使用更新API和動態腳本。 – oLeduc