2016-05-04 42 views
6

私は現在Elasticsearch V2.3.1を使用しています。 Javaで次のElasticsearchクエリを使用したいと思います。Javaを使用したElasticsearchのクエリによる更新

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

上記のクエリは、「kimchy」という名前の「ユーザー」を検索し、指定された値で「リスト」フィールドを更新します。このクエリは、複数のドキュメントを同時に更新します。 ここでは、Update API for Javaについては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で識別されていません。私がここで間違っていることを知ることができますか?ありがとう。

答えて

13

ES 2.3以降、クエリ機能による更新は、RESTエンドポイント_update_by_queryとして使用できますが、Javaクライアントでは使用できません。お使いのJavaクライアントコードから、このエンドポイントを呼び出すためには、あなたがこの

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

のように、あなたのpom.xmlにreindexモジュールを含める必要が次に、あなたのクライアントを構築するときに、このモジュールを含める必要があります。

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

UPDATE

あなたがタイプ(複数可)を指定する必要がある場合は、更新に焦点を当てる必要があり、あなたがそうすることができます。

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

あなたは 'インポート静的org.elasticsearch.index.query.QueryBuilders.termQueryを追加する必要があります;' – Val

+0

こんにちは@Val、それは(しかし、BulkIndexByScrollResponseのフィルタを使用して)この方法で働いた私は "Kimchy"という名前のユーザーを持つ1つのドキュメントを更新することができます。 BulkIndexByScrollResponseでsetQueryを使用して複数のドキュメントを更新することは可能ですか?またはおそらく他の方法ですか? –

+0

もちろん、あらゆる種類のクエリを作成できます。それはほんの一例でした。あなたの質問は何ですか? – Val

関連する問題