6

クラスター全体に分散された 7 つの異なるインデックスから最大 200K のヒットを返すクエリがあります。結果を次のように処理します。

while (true) {
    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();

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

    //Break condition: No hits are returned
    if (scrollResp.hits().hits().length == 0) {
        break;
    }
}

client.prepareSearchScroll 行が、次の一連の検索ヒットを返す前にかなりの時間ハングする可能性があることに気付きました。これは、コードを長く実行するほど悪化するようです。

私の検索設定は次のとおりです。

SearchRequestBuilder searchBuilder = client.prepareSearch( index_names )
    .setSearchType(SearchType.SCAN)
    .setScroll(new TimeValue(60000)) //TimeValue?
    .setQuery( qb )
    .setFrom(0) //?
    .setSize(5000); //number of jsons to get in each search, what should it be? I have no idea.
    SearchResponse scrollResp = searchBuilder.execute().actionGet();

多くの結果を調べる場合、スキャンとスクロールに時間がかかることが予想されますか? 私はElastic Searchに非常に慣れていないので、非常に明白なものを見落としている可能性があることに注意してください。

私のクエリ:

QueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("tweet", interesting_words));
4

4 に答える 4

8

.setSize(5000)これは、各client.prepareSearchScroll呼び出しがシャードごとに5000レコードを取得することを意味します。バックソースを要求しています。レコードが大きい場合、メモリに5000レコードをアセンブルするのに時間がかかる場合があります。もっと少ない数を試してみることをお勧めします。100と10を試して、パフォーマンスが向上するかどうかを確認してください。

.setFrom(0)必要ありません。

于 2012-11-20T20:17:09.220 に答える
7

私はこの振る舞いに非常に戸惑い、@AaronMのコメントで答えを見つけるのに長い時間がかかったので、ここに別の答えを追加します

これは、Java API を使用する ES 1.7.2 に適用されます。

500m レコードのインデックスをスクロール/スキャンしていましたが、約 400k 行を返すクエリを使用していました。

スクロール サイズは 1,000 から始めましたが、これはネットワークと CPU の観点から妥当なトレードオフのように思えました。

このクエリの実行は非常に遅く、完了するまでに約 30 分かかり、カーソルからのフェッチの間に非常に長い一時停止がありました。

実行中のクエリだけではないかと心配し、スクロール サイズを小さくしても効果があるとは思えませんでした。

ただし、上記の AaronM のコメントを見て、スクロール サイズを 10 にしてみました。

ジョブ全体が 30 秒で完了しました (これは ES を再起動したかどうかに関係なく、おそらくキャッシュとは関係ありません) - 約 60 倍のスピードアップ!!!

したがって、スクロール/スキャンのパフォーマンスに問題がある場合は、スクロール サイズを小さくすることを強くお勧めします。これについてはインターネット上であまり見つけられなかったので、ここに投稿しました。

于 2016-07-22T20:42:11.720 に答える
2
  • クライアントノードまたはマスターノードではなく、データノードのクエリ
  • filter_pathプロパティで必要なフィールドを選択します
  • ドキュメントのサイズに合わせてスクロール サイズを設定します。魔法のルールはありません。値を設定して試してみる必要があります。
  • ネットワーク帯域幅を監視する
  • それだけでは不十分な場合は、いくつかのマルチスレッドのものに行きましょう:

Elasticsearch インデックスは複数のシャードで構成されていると考えてください。この設計は、操作を並列化できることを意味します。

インデックスに 3 つのシャードがあり、クラスターに 3 つのノードがあるとします (インデックスごとにシャードよりも多くのノードを持つことをお勧めします)。

それぞれ別のスレッドで 3 つの Java "ワーカー" を実行して、別のシャードとノードを検索スクロールし、キューを使用して結果を "一元化" することができます。

このように、あなたは良いパフォーマンスをするでしょう!

これは、elasticsearch-hadoop ライブラリが行うことです。

インデックスに関するシャード/ノードの詳細を取得するには、https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html API を使用します。

于 2016-10-13T12:43:03.977 に答える
-1

ここでドキュメントを読むことができます

SearchScrollRequestBuilder !

Timevalue はスクロールを維持する時間だと思います

setScroll(TimeValue keepAlive)

設定すると、指定されたタイムアウトの間、検索リクエストのスクロールが有効になります。

ここで詳細を読むことができます:

スクロール

于 2015-09-11T09:12:17.043 に答える