2015-10-04 10 views
9

I documenti contengono solo campi "url" (analizzati) e "respsize" (not_analyzed) all'inizio. Voglio aggiornare i documenti che corrispondono all'URL e aggiungere un nuovo campo "categoria" Intendo; in un primo momento doc1:Come aggiornare più documenti che corrispondono a una query in elasticsearch

{ 
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz", 
"respsize":"500" 
} 

Ho un dati esterni e so "stackoverflow.com" appartiene alla categoria 10, E ho bisogno di aggiornare il documento, e fare le cose come:

{ 
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz", 
"respsize":"500", 
"category":"10" 
} 

Ovviamente lo farò tutti i documenti i cui campi URL hanno "stackoverflow.com" e ho bisogno dell'aggiornamento di ogni documento una volta .. Poiché i dati della categoria di url non sono modificabili, non è necessario aggiornarli di nuovo. Ho bisogno di usare _update api con _version numero per controllarlo ma non posso comporre la query dsl. EDIT corro questo e guarda funziona bene: enter image description here Ma i documenti non modificati .. enter image description here

Sebbene risultato della query sembra vero, nuovo campo non aggiunto al docs, hanno bisogno di aggiornare o ecc?

risposta

20

È possibile utilizzare lo update by query plugin per fare proprio questo. L'idea è di selezionare tutto il documento senza uno category e il cui numero url corrisponde a una determinata stringa e aggiunge la categoria desiderata.

curl -XPOST 'localhost:9200/webproxylog/_update_by_query' -d ' 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "url": "stackoverflow.com" 
       } 
      }, 
      { 
       "missing": { 
       "field": "category" 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "script" : "ctx._source.category = \"10\";" 
}' 

Dopo l'esecuzione di questo, tutti i vostri documenti con url: stackoverflow.com che non hanno una categoria, otterrà category: 10. È possibile eseguire nuovamente la stessa query in un secondo momento per correggere i nuovi documenti stackoverflow.com che sono stati indicizzati nel frattempo.

assicurarsi di attivare gli script in elasticsearch.yml e riavviare ES anche:

script.inline: on 
script.indexed: on 

Nello script, sei libero di aggiungere come molti campi come si desidera, ad esempio,

... 
    "script" : "ctx._source.category1 = \"10\"; ctx._source.category2 = \"20\";" 

UPDATE

ES 2.3 offre ora la funzionalità update by query. È ancora possibile utilizzare la query sopra esattamente come è e funzionerà (tranne che filtered e missing sono deprecati, ma funzionano ancora;).

+1

Il primo 'term' nel tuo aggiornamento per query dovrebbe essere sul campo 'heroname' not' url'. Gli screenshot non sembrano avere nulla in comune con i documenti iniziali nella tua domanda. – Val

+0

Lo cambio già dispiaciuto, –

+0

il tuo campo 'heroname' è analizzato o no? se aggiungi il filtro 'mancante' alla tua query di ricerca in alto, cosa ottieni? – Val

0

Tutto sembra ottimo ma solo per aggiungere alla risposta @Val, Update By Query è disponibile in ElasticSearch 2.x ma non per le versioni precedenti. Nel nostro caso utilizziamo 1.4 per motivi preesistenti e non c'è possibilità di aggiornamento in un futuro prevedibile, quindi un'altra soluzione utilizza l'aggiornamento tramite il plug-in di query fornito qui: https://github.com/yakaz/elasticsearch-action-updatebyquery

Problemi correlati