ElasticSearch的Scroll與Scan有何作用?區別?
使用ElasticSearch的scroll和scan解決大資料集合問題
功能:解決在ElasticSearch中大資料集合的查詢需求,可以使用scroll scan可以較輕鬆的遍歷elasticsearch的某個index.
什麼是深度分頁?
使用es的from和size語法來進行範圍取值。 比如size=10&from=5000 ,這就是深度分頁的用法。 為了拿到想要的 10個數據,es首先會掃描shard分片進行匹配並排序資料,之後算出5000個。這樣就能拿到你想要那10個數據。 重複操作會很蛋疼,ElasticSearch的scroll便有了用武之地!
elasticsearch的scroll是什麼?
可以簡單理解為mysql的cursor遊標,比如你一次請求的資料會很大,可以使用scroll這樣的流式介面,scroll會把你的所需要的結果標記起來。但是這scroll的查詢還是會對資料進行排序的,這樣會影響效能。 若你是單純的想要資料,那麼可以使用scan,因為scan會告訴 elasticsearch 不去排序。scan模式會掃描shard分片中的資料,單純的掃除匹配,而不會像scroll進行排序處理。
對於沒有排序的深度分頁需求, scan scroll組合使用是最好的選擇。scan scroll的流式介面用法很是簡單,在url裡擴充欄位 search_type 是scan型別,scroll是3分鐘,當次查詢的結果會在elasticsearch標記3分鐘。
這裡的size 1000個會在每個shard起到作用。 並不是把所有結果限制為1000個 ! 如果你的分片數目有10個,那麼你最多可以拿到 1000 * 10的資料。
例子:
#xiaorui.cc
curl -XGET xiaorui.cc:9200/blog/breif/_search?pretty&search_type=scan&scroll=3m -d
{"size":1000,"query":{"match_all":{}}}
返回體:
#xiaorui.cc
{
"_scroll_id": : "UVM4U0NMd2sdfcvrtrtpjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9sdfou4kjldsfkoicvuefldfjldfgjaY1VyUVM4U0NMd2pjWlJ3YW" ,
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
}
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
如果你想設定更多的時間:
Time Units
y Year
M Month
w Week
d Day
h Hour
m Minute
s Second
注意: 第一次的查詢結果只能拿到scroll_id token,並沒有資料。 接著我們可以拿著這個token繼續去訪問,我們就能拿到真實命中的資料。但是這個token只能訪問一次,切記…
curl –XGET 'localhost:9200/_search/scroll?scroll=2m&pretty&scroll_id=UVK8sdfdfgNMSDF2pcRaftJKHlovaMNDSF4M4U0NMd2pjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9sdfou4kjldsfkoicvuefldfjldfgjaY1VyUVM4U0NMd2pjWlJ3YW'
檢索下一批結果在url裡面不用再寫index、type。 每一次對scrollAPI的請求都會返回結果的下一批直到沒有更多的結果返回為止。比如,當hits陣列為空的時候。 這樣每次的查詢都會拿到一個scroll token和response hits結果集。
如果你想刪除scroll id,那麼可以呼叫delete方法刪除. 除非是你的scan任務特別的,一般scroll設立個5分鐘就可以了。
#xiaorui.cc
curl –XDELETE 'localhost:9200/_search/scroll -d "UVK8sdfdfgNMSDF2pcRaftJKHlovaMNDSF4M4U0NMd2pjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9sdfou4kjldsfkoicvuefldfjldfgjaY1VyUVM4U0NMd2pjWlJ3YW"
8/17/2017 6:53:26 PM