2016-05-04 14 views
6

Ich verwende derzeit Elasticsearch V2.3.1. Ich möchte die folgende Elasticsearch-Abfrage in Java verwenden.Update von Abfrage in Elasticsearch mit Java

Die obige Abfrage sucht nach "user" namens "kimchy" und aktualisiert das Feld "List" mit den angegebenen Werten. Diese Abfrage aktualisiert mehrere Dokumente gleichzeitig. Ich lese über die Update-API für Java hier https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/java-docs-update.html aber konnte nicht finden, was ich suchte. Die Update-API für Java spricht nur von der Aktualisierung einzelner Dokumente gleichzeitig. Gibt es eine Möglichkeit, mehrere Dokumente zu aktualisieren? Entschuldigung, wenn mir etwas offensichtlich fehlt. Vielen Dank für Ihre Zeit.

Update:

Ich habe versucht, die folgenden Java-Code:

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(); 

So bearbeitete ich das Java-Programm, wie oben und der Termquery wird von Java nicht identifiziert. Darf ich wissen, was ich hier falsch mache? Vielen Dank.

Antwort

13

Ab ES 2.3 ist die Funktion zum Aktualisieren nach Abfrage als REST-Endpunkt _update_by_query verfügbar, aber auch nicht für Java-Clients. Um diesen Endpunkt von Ihrem Java-Client-Code aufzurufen, müssen Sie die reindex Modul in Ihrem pom.xml aufzunehmen, wie dies

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

Dann müssen Sie dieses Modul enthalten, wenn Ihr Kunde den Aufbau:

clientBuilder.addPlugin(ReindexPlugin.class); 

Endlich kann man es so nennen:

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

Wenn Sie den Typ angeben müssen (n) das Update konzentrieren sollten, können Sie dies tun:

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

Sie müssen 'import static org.elasticsearch.index.query.QueryBuilders.termQuery hinzuzufügen;' – Val

+0

Hi @Val, es funktioniert aber auf diese Weise (mit Filter in BulkIndexByScrollResponse) Ich kann nur ein Dokument aktualisieren, das einen Benutzer namens "Kimchy" hat. Ist es möglich, mehrere Dokumente mit setQuery in BulkIndexByScrollResponse zu aktualisieren? oder möglicherweise anders? –

+0

Natürlich können Sie jede Art von Abfrage erstellen. Das war nur ein Beispiel. Was ist deine Frage? – Val

Verwandte Themen