php-elasticsearch scroll分页详解

背景

ps:首先我们在一个索引里面写入一万条以上的数据。作为数据源 

现在我想看到第一万零一条数据,首先第一想法是,from 10000 size 1 ,这样做会包下面错误。显然是不成立的。此时便会用到scroll分页, 

补充一点:from size分页,假如你要获取第1000到1010条数据,即from: 1000 size :10,它内部会先取出1-1010条数据,然后丢弃第1-1000条,保留最后十条并展示。 

正文 :

(1)es内操作

第一步: index/type/_search?pretty&scroll=2m

此时会返回一个scroll值

第二步: 直接用scroll_id进行查询。

这样一步步的滚动查询就可以了

第三步 清除scroll

虽然我们在设置开启scroll时,设置了一个scroll的存活时间,但是如果能够在使用完顺手关闭,可以提早释放资源,降低ES的负担


DELETE 127.0.0.1:9200/_search/scroll
{
    "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRVpSRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB"
}
 

(2)php-elasticsearch scroll分页

  public function index()
    {
        $page = $_REQUEST['page'] ?? 1;
        $size = $_REQUEST['size'] ?? 10;
        $searchParams=array(
            "index" => "eds_user_location",
            "type" => "info",
//            "search_type" => "QUERY_THEN_FETCH",
            "scroll" => "1m",
            "size" => $size,
//            "from" => $page*$size
        );
        $searchParams['body'] = array(
         #查询条件
        );
        $docs = $this->client->search($searchParams);
        $scroll_id = $docs['_scroll_id'];
        $i=1;
        if($page == 1 ){
            $this->ajaxReturn(array(
                'code' => 1,
                'data' => $docs['hits']['hits']
            ));
        }
        while ($i < $page) {
            $response =  $this->client->scroll(
                array(
                    "scroll_id" => $scroll_id,
                    "scroll" => "1m"
                )
            );

            if (count($response['hits']['hits']) > 0) {
                // Do Work Here

                // Get new scroll_id
                $scroll_id = $response['_scroll_id'];
            } else {
                break;
            }
            $i++;
        }
        $this->ajaxReturn(array(
            'code' => 1,
            'data' => $response['hits']['hits']
        ));
    }

猜你喜欢

转载自blog.csdn.net/weixin_38617363/article/details/87011838