1. 程式人生 > >ElasticSearch 翻頁查詢

ElasticSearch 翻頁查詢

相對於Ealsticsearch的search API, 翻頁查詢可以將查詢結果集分頁返回,而不是將所有的結果放在一個page返回。如果查詢的結果集包含大量的資料,就可以用到翻頁查詢(Scroll) API,比如有200K條資料,可以將它們分成20次請求,每次只返回10k條查詢結果. 有點類似於資料庫裡面的遊標。

要使用翻頁查詢,需要在search請求中指定一個引數:scroll。這個引數是告訴elasticsearch要保留多久當前這個Search Context, 可以理解為Session 的keep alive。這樣下次查詢的時候只需要傳遞一個scroll id就可以了。例如?scroll=5m (保留5分鐘)。
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d '
{
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
'
上面的請求的response裡面會包含一個_scroll_id,這個_scroll_id必須加到下一次請求的body裡面。需要注意的是,每次新的查詢必需用最近返回的_scroll_id

curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
'

可以看到上面的請求裡面不再需要將第一次的查詢引數(比如title == 'elasticsearch')放到request body裡面,因為elasticsearch會根據這個scroll_id查到這個id對應的Search Context。
每次的翻頁查詢都會返回下一頁的結果集,直到所有的查詢結果都已經返回了,這個時候返回的response裡面的hits就會是空的,所以我們可以用hits
來判斷是不是查詢結束了。

Clear 翻頁API
預設Elasticsearch會刪除所有timeout的scroll_id對就的search context。但使用者也可以提前刪除這些scroll_id, 因為如果查詢非常頻繁時,保留這麼多的search context也是需要很多開銷的。下面是關於怎麼顯式地刪除這些scroll_id。
curl -XDELETE localhost:9200/_search/scroll -d '
{
"scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"]
}'
你也可以把所有的scroll_id放到一個數組裡面一次刪除:

curl -XDELETE localhost:9200/_search/scroll -d '
{
"scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1", "aGVuRmV0Y2g7NTsxOnkxaDZ"]
}'

要刪除所有的scroll_id,可以指定all這個引數:
curl -XDELETE localhost:9200/_search/scroll/_all