2017-10-06 3 views
1

私はスクロール機能により、エラスティックサーチより少し混乱しています。 elasticsearchでは、ユーザーが結果セットをスクロールするたびに検索APIを呼び出すことが可能ですか?ドキュメントエラスティックサーチスクロール

"search_type" => "scan", // use search_type=scan 
"scroll" => "30s",   // how long between scroll requests. should be small! 
"size" => 50,    // how many results *per shard* you want back 

から はそれが何のレコードが存在しなくなるまで、それは30秒ごとに戻り、結果のすべてのセットの検索を実行することを意味しますか?

たとえば、私のESは合計500レコードを返します。私はESから2レコードのレコードをそれぞれ250レコードで取得しています。最初に250レコードの最初のセットを表示する方法はありますか?ユーザーがスクロールして250レコードの2セット目をスクロールすると、最初のセットが表示されますか?

答えて

0

scrollプロパティの目的が間違っていると思います。これは、elasticsearchが30秒後に次のページデータを取得するという意味ではありません。最初のスクロール要求を行うときに、スクロールコンテキストをいつ閉じるべきかを指定する必要があります。 scrollパラメータは、30秒後にスクロールコンテキストを閉じるように指示しています。

最初のスクロール要求後に、scroll_idパラメータが返されます。次のページでは、その値を渡してスクロールレスポンスの次のページを取得する必要があります。 30秒以内に次のスクロール要求を行わない場合、スクロール要求は閉じられ、そのスクロール要求の次のページを取得することはできません。

1

ユースケースの例として説明したものは、実際にはsearch results paginationです。これはどの検索クエリでも利用可能であり、10kの結果によって制限されています。あなたがその10kの制限を超える必要がある場合にはscrollリクエストが必要です。scrollクエリでは、ドキュメントのコレクション全体を取得することもできます。

おそらく、ここでの混乱の原因は、scrollという用語があいまいであるということです。つまり、クエリのタイプを意味します。また、このクエリのパラメータの名前です(other commentsに記載されています。次のスクロールチャンクを取得するのを待っています)。

scrollクエリは重く、絶対に必要になるまで避けてください。実際には、それは言うdocs に:

スクロールは、リアルタイムのユーザーの要求のために意図されていないのではなく、大量のデータを処理するために...

今すぐあなたの他の質問について:

elasticsearchでは、ユーザーが結果セットをスクロールするたびに検索APIを呼び出すことができますか?

はい、であってもいくつかのparallel scroll requests が可能である:

各スクロールは独立しており、任意のスクロール要求のような並列に処理することができます。

1

あなたが探しているのは、ページ設定です。

固定サイズをクエリし、fromパラメータを設定することで、目的を達成できます。250個の結果のバッチで表示を設定する場合は、size = 250を設定し、連続するクエリごとにfromの値を250だけ増やします。逆に

GET /_search?size=250      ---- return first 250 results 
GET /_search?size=250&from=250   ---- next 250 results 
GET /_search?size=250&from=500   ---- next 250 results 

Scan & scrollはあなたが単一の検索と結果の大規模なセットを取得し、理想的には、新しいインデックスへの再インデックスデータのような操作のために意味することができます。検索結果をリアルタイムで表示するためにこれを使用することはお勧めしません。

Scan & scrollを簡単に説明すると、基本的にスキャン要求に含まれるクエリのインデックスがスキャンされ、scrol_idが返されます。このscroll_idは、結果の次のバッチを返すために次のスクロール要求に渡すことができます。

はスクローラが初期化されるhappen-

  • イベント以下、上記の例では、以下の例 -

    # Initialize the scroll 
    page = es.search(
        index = 'yourIndex', 
        doc_type = 'yourType', 
        scroll = '2m', 
        search_type = 'scan', 
        size = 1000, 
        body = { 
        # Your query's body 
        }) 
        sid = page['_scroll_id'] 
        scroll_size = page['hits']['total'] 
    
        # Start scrolling 
        while (scroll_size > 0): 
        print "Scrolling..." 
        page = es.scroll(scroll_id = sid, scroll = '2m') 
        # Update the scroll ID 
        sid = page['_scroll_id'] 
        # Get the number of results that we returned in the last scroll 
        scroll_size = len(page['hits']['hits']) 
        print "scroll size: " + str(scroll_size) 
        # Do something with the obtained page 
    

    を考えます。これにより、結果の最初のバッチがscroll_idと一緒に返されます。

  • 各スクロール要求に対して、更新されたscroll_id(前のスクロール要求で受信された)が送信され、次のバッチ結果が戻されます。
  • スクロール時間は基本的に、検索コンテキストが生きている時間です。次のスクロール要求が設定された時間枠内に送信されない場合、検索コンテキストは失われ、結果は返されません。このため、膨大な数のドキュメントを持つインデックスのリアルタイム結果表示には使用すべきではありません。