如何使用PHP API对ElasticSearch结果进行分页

时间:2017-09-25 10:19:13

标签: php elasticsearch

按照文档中的示例,我搜索我的类型:

    $params = [
        'index' => $this->index,
        'type' => $this->type,
        "scroll" => "30s",
        "size" => 10,
        'body' => $json
    ];

    $response = $this->es->search($params);

现在$ response包含10个结果和一个_scroll_id。我如何使用它来分页我的结果?我正在看这个例子

https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html#_scrolling

然后医生建议这样做:

while (isset($response['hits']['hits']) && count($response['hits']['hits']) > 0) {
$scroll_id = $response['_scroll_id'];
$response = $client->scroll([
        "scroll_id" => $scroll_id,  //...using our previously obtained _scroll_id
        "scroll" => "30s"           // and the same timeout window
    ]
);
}

但不清楚我是否必须执行新请求,或者while循环是否将所有结果存储在变量中并将其传递给模板。

要展示的任何实际例子吗?

感谢

1 个答案:

答案 0 :(得分:0)

在第一次请求scroll参数后,您将收到普通有效负载(_shards,take,hits等)和_scroll_id以及elasticsearch。在hits中,您将找到total个已找到的文档,因此您拥有:每页项目数和项目总数。

要计算页数 - 你需要做简单的数学运算。

要从elasticsearch接收下一批数据 - 请运行:

curl 'localhost:9200/_search/scroll ' -d '{
    "scroll" : "30s", 
    "scroll_id" : "cXVlcnlUaGVuRmV0Y2g7NTsxMzU0MDQzNjY6QnNHMjd0bXlTZ3Ftd1dkblRUd3NQZzsxMDE1NzI4Mjc6ajFzVmtLQUdSaEduRWFRVi1GZE05UTsxMDE1NzI4MjY6ajFzVmtLQUdSaEduRWFRVi1GZE05UTsxMDE1ODAzODc6TURuUG5nbzRUVU9NUUFjSERqM2hIQTsxMDE1ODAzODg6TURuUG5nbzRUVU9NUUFjSERqM2hIQTswOw==" 
}'

使用滚动条只能接收下一批,您无法跳转到特定页面。