2014-12-30 146 views
1

我試圖用腳本更新部分嵌套對象。但是我寫的是不正確的。elasticsearch:在嵌套對象(HTTP)中更新

我有這個對象:

{ 
    "_index" : "test_7", 
    "_type" : "testField", 
    "_id" : "1", 
    "_version" : 1, 
    "found" : true, 
    "_source" : { 
    "view" : { 
     "hit" : 3, 
     "pages" : [ 
     { 
      "name" : "A", 
      "hit" : 1 
     }, 
     { 
      "name" : "B", 
      "hit" : 1 
     }, 
     { 
      "name" : "C", 
      "hit" : 1 
     } 
     ] 
    } 
    } 
} 

我想在頁面上添加3次命中。

用名爲 「B」 現有頁面:

{ 
    "view" : { 
     "hit" : 6, 
     "pages" : [ 
     { 
      "name" : "A", 
      "hit" : 1 
     }, 
     { 
      "name" : "B", 
      "hit" : 4 
     }, 
     { 
      "name" : "C", 
      "hit" : 1 
     } 
     ] 
    } 
    } 

隨着一個名爲 「d」 新的一頁:

{ 
    "view" : { 
     "hit" : 6, 
     "pages" : [ 
     { 
      "name" : "A", 
      "hit" : 1 
     }, 
     { 
      "name" : "B", 
      "hit" : 1 
     }, 
     { 
      "name" : "C", 
      "hit" : 1 
     }, 
     { 
      "name" : "D", 
      "hit" : 3 
     } 
     ] 
    } 
    } 

請你能告訴我怎麼寫的HTTP請求? 此外,我可以在哪裏閱讀更多關於「ctx._source」的文檔?

謝謝。

+0

「我想添加3個點擊,如果P頁。」 - 你的問題不是很清楚。你在談論兩種不同的場景嗎? –

+1

是的,因爲我不知道有多少頁面有我的對象。我可能會更新現有頁面,或者我可能會添加一個新頁面。 我看着http://stackoverflow.com/questions/18360225/elastic-search-is-it-possible-to-up-date-nested-objects-without-updating-the-ent –

回答

1

ctx_source不過是您提交用於索引特定文檔的源JSON文檔。 您需要在_update API

curl -XPOST 'http://localhost:9200/data/data/X_UucUuYTOqdB8eo2H-XWw/_update' -d '{ 
    "script": "increment", 
    "params": { 
    "newPage": { 
     "name": "A", 
     "hit": 40 
    } 
    } 
}' 

增量腳本

source = ctx._source 
Boolean isAdded = false; 
for(page in source.view.pages){ 
    if(page.name == newPage.name){ 
     page.hit += newPage.hit 
     isAdded = true 
    } 
} 
if(!isAdded){ 
    source.view.pages += newPage 
} 

使用腳本支持這裏指定的次數和在PARAMS部分頁面名。如果pageName是現有的,則該值將遞增或添加新值。

希望得到這個幫助。

+0

Thx! 同時我讀了mvel文檔(ES <1.4): http://mvel.codehaus.org/Language+Guide+for+2.0 我寫了一個醜陋的腳本。你的一個更好。 僅用於: { 「script」:「if((在ctx._source.view.pages中的名稱).contains(updated_data.name)){current =($ in ctx._source.view.pages if $ .name == updated_data.name)[0]; current.hit + = updated_data.hit;} else {ctx._source.view.pages + = updated_data;}「, 」params「:{ 」updated_data「:{ 「name」:「ini1」, 「hit」:3 } } } –