11

現在、Elasticsearch V2.3.1 を使用しています。Java で次の Elasticsearch クエリを使用したいと考えています。

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

上記のクエリは、「kimchy」という名前の「user」を検索し、指定された値で「List」フィールドを更新します。このクエリは、複数のドキュメントを同時に更新します。ここで Java の更新 API について読みましたhttps://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/java-docs-update.htmlが、探していたものが見つかりませんでした. Update API for Java は、一度に 1 つのドキュメントを更新することについてのみ説明します。複数のドキュメントを更新する方法はありますか? 明らかな何かが欠けている場合は申し訳ありません。お時間をいただきありがとうございます。

アップデート:

以下の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();

そこで、上記のように Java プログラムを編集しましたが、termQuery は Java によって識別されません。ここで私が間違っていることを知ってもいいですか?ありがとう。

4

2 に答える 2

16

ES 2.3 以降、クエリによる更新機能は REST エンドポイントとして利用できます_update_by_queryが、Java クライアントでは利用できません。reindexJava クライアント コードからこのエンドポイントを呼び出すには、次のように pom.xml にモジュールを含める必要があります。

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

次に、クライアントをビルドするときにこのモジュールを含める必要があります。

clientBuilder.addPlugin(ReindexPlugin.class);

最後に、次のように呼び出すことができます。

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

アップデート

更新の対象となるタイプを指定する必要がある場合は、次のように指定できます。

ubqrb.source("twitter").source().setTypes("type1");
BulkIndexByScrollResponse r = ubqrb.script(script)
    .filter(termQuery("user", "kimchy"))
    .get();
于 2016-05-05T03:49:30.963 に答える