2016-05-04 2 views
6

Attualmente sto utilizzando Elasticsearch V2.3.1. Voglio utilizzare la seguente query Elasticsearch in Java.Aggiornamento per query in Elasticsearch utilizzando Java

POST /twitter/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.List = [‘Item 1’,’Item 2’]” 
    }, 
    "query": { 
    "term": { 
     "user": "kimchy" 
    } 
    } 
} 

La query precedente ricerca "utente" denominato "kimchy" e aggiorna il campo "Elenco" con valori dati. Questa query aggiorna più documenti contemporaneamente. Ho letto l'API di aggiornamento per Java qui https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/java-docs-update.html ma non sono riuscito a trovare quello che stavo cercando. L'API di aggiornamento per Java parla solo dell'aggiornamento di un singolo documento alla volta. C'è un modo per aggiornare più documenti? Scusa se mi manca qualcosa di ovvio. Grazie per il tuo tempo.

Aggiornamento:

Ho provato il seguito del codice Java:

Client client = TransportClient.builder().addPlugin(ReindexPlugin.class) 
    .build().addTransportAddress(new InetSocketTransportAddress(
     InetAddress.getByName("127.0.0.1"), 9300)); 

UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE 
    .newRequestBuilder(client); 

Script script = new Script("ctx._source.List = [\"Item 1\",\"Item 2\"]"); 

//termQuery is not recognised by the program 
BulkIndexByScrollResponse r = ubqrb.source("twitter").script(script) 
    .filter(termQuery("user", "kimchy")).execute().get(); 

Così ho modificato il programma Java come sopra e la termQuery non è identificato da Java. Posso sapere cosa sto facendo male qui? Grazie.

risposta

13

A partire da ES 2.3, la funzione di aggiornamento per query è disponibile come endpoint REST _update_by_query ma non per i client Java. Per chiamare questo endpoint dal codice client Java, è necessario includere il modulo reindex nel vostro pom.xml, come questo

<dependency> 
    <groupId>org.elasticsearch.module</groupId> 
    <artifactId>reindex</artifactId> 
    <version>2.3.2</version> 
</dependency> 

allora avete bisogno di includere questo modulo quando si costruisce il vostro cliente:

clientBuilder.addPlugin(ReindexPlugin.class); 

Infine si può chiamare in questo modo:

UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE.newRequestBuilder(client); 

Script script = new Script("ctx._source.List = [\"Item 1\",\"Item 2\"]"); 

BulkIndexByScrollResponse r = ubqrb.source("twitter") 
    .script(script) 
    .filter(termQuery("user", "kimchy")) 
    .get(); 

UPDATE

0.123.

Se è necessario specificare il tipo (s) l'aggiornamento dovrebbe concentrarsi su, si può fare così:

ubqrb.source("twitter").source().setTypes("type1"); 
BulkIndexByScrollResponse r = ubqrb.script(script) 
    .filter(termQuery("user", "kimchy")) 
    .get(); 
+2

È necessario aggiungere 'import org.elasticsearch.index.query.QueryBuilders.termQuery statica;' – Val

+0

Ciao @Val, ha funzionato ma in questo modo (usando il filtro in BulkIndexByScrollResponse) Posso aggiornare solo un documento che ha un utente chiamato "Kimchy". È possibile aggiornare più documenti utilizzando setQuery in BulkIndexByScrollResponse? o forse in altro modo? –

+0

Ovviamente, puoi creare qualsiasi tipo di query. Quello era solo un esempio. Qual è la tua domanda? – Val