2017-11-27 6 views
0

私はelasticsearch-phpを使用しています。elasticsearchのスクロールが動作していることを知る方法を教えてください

私はこのコードを使用していますが、テストではうまくいきます。

require_once 'app/init.php'; 

if (isset($_GET['q'])) { 
       $q = $_GET['q']; 
       $query= $es->search([ 
         'index' => 'rebajas', 
         //'search_type' => 'scan', 
         'scroll' => '2m', 
         //'from' => 0, 
         'size' => 1000, 
         'body'=>[ 
         'query'=>[ 
          'bool' => [ 
          'should' => [ 
           'match'=>['titulo'=>$q], 

          ] 
          ] 

         ] 

         ] 


        ]); 
        if ($query['hits']['total']>=1) { 

         $scroll_size = $query['hits']['total']; 
         $results = $query['hits']['hits']; 

         //scrol 
         $scroll_id = $query['_scroll_id']; 


         print " total results: " . $scroll_size; 
         $count = 0; 
         // first set of scroll results 
         for ($i=0; $i<$scroll_size; $i++) { 
          $count++; 
         } 
         //scroll 
         while (isset($query['hits']['hits']) && count($query['hits']['hits']) > 0) { 

          // ** 
          // Do your work here, on the $response['hits']['hits'] array 
          // ** 
          $conta =0; 
          foreach ($results as $r) { 
           $conta++; 

         ?> 

         <h1 class="mt-5"><a href=""><?php echo $conta." " .$r['_source']['titulo'];?></a> <i class="fa fa-search-plus" aria-hidden="true"></i></h1> 


         <?php 
          } 

          // When done, get the new scroll_id 
          // You must always refresh your _scroll_id! It can change sometimes 
          $scroll_id = $query['_scroll_id']; 

          // Execute a Scroll request and repeat 
          $query = $es->scroll([ 
            "scroll_id" => $scroll_id, //...using our previously obtained _scroll_id 
            "scroll" => "30s"   // and the same timeout window 
           ] 
          ); 
         } 


        } 

       } 

質問は以下のとおりです。このスクロールはどのように機能するの 、それが生産しているとき、およそ1万レコードを抽出し、それは非常に多くのレコードを持つサーバーをブロックしないのだろうか? どのように読み込まれているか確認できますか? これは、無限のスクロールと同じように機能します。つまり、ページが下がると、レコードがロードされます。

答えて

0

elasticsearchがサポートしている無限のスクロールを実装するにはどうすればよいですか?これは、クラス/フレームワーク全体の価値のある質問です。しかし、私はそれを刺すようにしましょう。

無限のスクロールが必要な場合は、最初にウェブサービスのエンドポイントからデータAPIを抜き出すことが必要です(つまり、データはページに読み込まれません。[最初のページにはあなたのウェブページが、それをする必要はありませんし、次のページをロードするためには、ほとんどそれは確かに独自のAPIとして持っていると思うでしょう])。次に、ユーザーがウェブページをスクロールダウンすると(つまり、ユーザーがn/PAGE_SIZEにスクロールして次のページをリクエストした場合)、AJAXにページをリクエストする必要があります。あなたは基本的にgoogle '無限のスクロールの実装'ではなく、this captures the intention pretty wellです。

これは、一般にelasticsearch(ウェブサイトの直接無限スクロールバッキングとしてESを使用する)の大きなユースケースではないと言われています。 reasons why are encapsulated hereのほとんど。基本的に、多くのオープンスクロールを持つことはelasticsearchで高価ですが、ユーザー数が少なく厳しいタイムアウトがあれば問題ありませんか?スクロールは「リアルタイム」の使用を意図したものではなく、データのエクスポートの使用のためのものです。

+0

私はelasticsearch情報をウェブページに表示する必要があります。これはページングを行うことが重要ですが、私はその方法を見つけていません。 – Vacanito

+0

単純なページングをしようとしている場合は、from/size https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.htmlを使用してみてください。比較的高価であると呼ばれる。しかし、基本的には、すでに見たレコード数とサイズ=をあなたのページサイズに使用します。 – Cheruvian

+0

ありがとう@Cheruvian、私はあなたが私に与えた情報をうまく処理しました。 – Vacanito

関連する問題