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']
));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM