1. 程式人生 > >ElasticSearch的Scroll與Scan有何作用?區別?

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