【问题标题】:Elasticsearch scroll scan query doesn't return all documents, missing first setElasticsearch 滚动扫描查询不返回所有文档,缺少第一组
【发布时间】:2017-03-07 17:47:35
【问题描述】:

我正在尝试滚动我的 ES 索引并获取所有文档,但看起来我一直错过初始滚动返回的第一组文档。例如,如果我的滚动大小为 10,而我的查询在滚动后总共返回 100,我将只有 90 个文档。关于我缺少什么的任何建议?

这是我目前尝试过的:

$json = '{"query":{"bool":{"must":[{"match_all":{}}]}}}';

$params = [
    "scroll" => "1m",
    "size" => 50,
    "index" => "myindex",
    "type" => "mytype",
    "body" => $json 
];

$results = $client->search($params);
$scroll_size = $results['hits']['total']; // returns total docs that match query
$s_id = $results['_scroll_id'];

print " total results:   " . $scroll_size;

//scroll
$count = 0;
while ($scroll_size > 0) {
    print "  SCROLLING...";
    $scroll_results = $client->scroll([
        'scroll_id' => $s_id,
        'scroll' => '1m'
    ]);

    // get number of results returned in the last scroll
    $scroll_size = sizeof($scroll_results['hits']['hits']);
    print "  scroll size: " . $scroll_size;

    // do something with results
    for ($i=0; $i<$scroll_size; $i++) {
        $count++;
    }
}
print " total id count: " . $id_count;

【问题讨论】:

    标签: php elasticsearch


    【解决方案1】:

    您执行的第一个查询返回文档数,也返回文档。第一个查询是建立滚动并获取第一组文档。一旦你处理了第一组结果,你就可以使用 scroll_id 来获取下一页等等。

    【讨论】:

      【解决方案2】:

      感谢@Ramdev。是的,经过一番挖掘,我意识到了这一点。对于其他人这就是最终对我有用的东西:

      $json = '{"query":{"bool":{"must":[{"match_all":{}}]}}}';
      $count = 0;
      $params = [
          "scroll" => "1m",
          "size" => 50,
          "index" => "myindex",
          "type" => "mytype",
          "body" => $json 
      ];
      
      $results = $client->search($params);
      $scroll_size = $results['hits']['total']; // returns total docs that match query
      $s_id = $results['_scroll_id'];
      
      print " total results:   " . $scroll_size;
      
      // first set of scroll results
      for ($i=0; $i<$size; $i++) {
          $count++;
      }
      //scroll
      while ($scroll_size > 0) {
          print "  SCROLLING...";
          $scroll_results = $client->scroll([
              'scroll_id' => $s_id,
              'scroll' => '1m'
          ]);
      
          // get number of results returned in the last scroll
          $scroll_size = sizeof($scroll_results['hits']['hits']);
          print "  scroll size: " . $scroll_size;
      
          // do something with results
          for ($i=0; $i<$scroll_size; $i++) {
              $count++;
          }
      }
      print " total id count: " . $id_count;
      

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 2017-09-10
        • 2021-10-31
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多