2016-04-01 17 views
0

私は弾性検索が初めてです。私はelasticsearchを使用して残りのAPI呼び出しを使用できることを読んでいました。クライアントJavaヒープメモリを気にせずにJavaクライアントを使用してEasticSearchを使用してクエリを行う方法

私は次のリンク読んでいた: http://blogs.justenougharchitecture.com/using-jest-as-a-rest-based-java-client-with-elasticsearch/

が、これはそれを行うための正しい方法です??

また、私の検索で返される検索結果の数に制限を設けたくありません(何百万ものレコードを返すことができます)。

テーブル内に何百万もの行がありますが、一度に1つの行を処理して処理するだけで、どこでもJavaヒープに格納しないでください。同様に私は可能な限りElastic Search Querying(クエリ内のすべてのレコードを必要とする)と似たようなことをしたいが、それらを反復しながらすべて一緒にメモリに入れない。

残りAPIを使用しない場合は、Javaクライアント(rest API経由)を使用することは可能ですか?この問題を解決する方法はありますか?

答えて

1

まず

おかげで、あなたはJavaや他のJVM言語を使用している場合、あなたもnative clientを使用することができます。 Jestは、依存関係を小さくする(Javaクライアントは基本的に完全なサーバーと同じです)、またはバイナリインターフェイスではなくHTTPインターフェイス経由でのみElasticsearchにアクセスしたい場合、またはアクセスできるようにする場合は、良い選択です。

第2に、スクロールAPIはhttps://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.htmlです(ただし、Jestのドキュメントでクイックリファレンスは見つかりませんでした)。 これはResultSetのようには機能しませんが、すべての結果に対してチャンクで反復処理を行うことができます。ドキュメント

QueryBuilder query = ...; 

SearchResponse scrollResponse = client.prepareSearch(index) 
     .setSearchType(SearchType.SCAN) 
     .setScroll(new TimeValue(60000)) // timeout 
     .setQuery(query) 
     .setSize(100) // bulk size 
     .execute().actionGet(); 

//Scroll until no hits are returned 
while (!scrollResp.getHits().getHits().isEmpty()) { 

    for (SearchHit hit : scrollResp.getHits().getHits()) { 
     //Handle the hit... 
    } 

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()) 
     .setScroll(new TimeValue(60000)) 
     .execute().actionGet(); 
} 
+0

からコピー例えば、reply.Inライン「SearchResponse scrollResponse = client.prepareSearch(インデックス)」の​​おかげで、この「インデックス」が何である、それはデータがindexdされるパスであります?私のクライアントが他のマシンにいる場合は、 "インデックス"として渡す必要があります。ご意見をお聞かせください。 –

関連する問題