elasticsearch 的滚动(scroll)
Scroll
search 請(qǐng)求返回一個(gè)單一的結(jié)果“頁(yè)”,而 scroll API 可以被用來(lái)檢索大量的結(jié)果(甚至所有的結(jié)果),就像在傳統(tǒng)數(shù)據(jù)庫(kù)中使用的游標(biāo) cursor。
滾動(dòng)并不是為了實(shí)時(shí)的用戶響應(yīng),而是為了處理大量的數(shù)據(jù),例如,為了使用不同的配置來(lái)重新索引一個(gè) index 到另一個(gè) index 中去。
client 支持:Perl 和 Python
注意:從 scroll 請(qǐng)求返回的結(jié)果反映了 search 發(fā)生時(shí)刻的索引狀態(tài),就像一個(gè)快照。后續(xù)的對(duì)文檔的改動(dòng)(索引、更新或者刪除)都只會(huì)影響后面的搜索請(qǐng)求。
為了使用 scroll,初始搜索請(qǐng)求應(yīng)該在查詢中指定 scroll 參數(shù),這可以告訴 Elasticsearch 需要保持搜索的上下文環(huán)境多久(參考Keeping the search context alive),如 ?scroll=1m。
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d ' {"query": {"match" : {"title" : "elasticsearch"}} } '使用上面的請(qǐng)求返回的結(jié)果中包含一個(gè) scroll_id,這個(gè) ID 可以被傳遞給 scroll API 來(lái)檢索下一個(gè)批次的結(jié)果。
curl -XGET 'localhost:9200/_search/scroll' -d' {"scroll" : "1m", "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" } '- GET 或者 POST 可以使用
- URL不應(yīng)該包含 index 或者 type 名字——這些都指定在了原始的 search 請(qǐng)求中。
- scroll 參數(shù)告訴 Elasticsearch 保持搜索的上下文等待另一個(gè) 1m
- scroll_id 參數(shù)
每次對(duì) scroll API 的調(diào)用返回了結(jié)果的下一個(gè)批次知道沒(méi)有更多的結(jié)果返回,也就是直到 hits 數(shù)組空了。
為了向前兼容,scroll_id 和 scroll 可以放在查詢字符串中傳遞。scroll_id 則可以在請(qǐng)求體中傳遞。
curl -XGET 'localhost:9200/_search/scroll?scroll=1m' -d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'注意:初始搜索請(qǐng)求和每個(gè)后續(xù)滾動(dòng)請(qǐng)求返回一個(gè)新的 _scroll_id——只有最近的 _scroll_id 才能被使用。
如果請(qǐng)求指定了聚合(aggregation),僅僅初始搜索響應(yīng)才會(huì)包含聚合結(jié)果。
使用 scroll-scan 的高效滾動(dòng)
使用 from and size 的深度分頁(yè),比如說(shuō) ?size=10&from=10000 是非常低效的,因?yàn)?100,000 排序的結(jié)果必須從每個(gè)分片上取出并重新排序最后返回 10 條。這個(gè)過(guò)程需要對(duì)每個(gè)請(qǐng)求頁(yè)重復(fù)。
scroll API 保持了哪些結(jié)果已經(jīng)返回的記錄,所以能更加高效地返回排序的結(jié)果。但是,按照默認(rèn)設(shè)定排序結(jié)果仍然需要代價(jià)。
一般來(lái)說(shuō),你僅僅想要找到結(jié)果,不關(guān)心順序。你可以通過(guò)組合 scroll 和 scan 來(lái)關(guān)閉任何打分或者排序,以最高效的方式返回結(jié)果。你需要做的就是將 search_type=scan 加入到查詢的字符串中:
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m&search_type=scan' -d ' {"query": {"match" : {"title" : "elasticsearch"}} } '- 設(shè)置 search_type 為 scan 可以關(guān)閉打分,讓滾動(dòng)更加高效。
掃描式的滾動(dòng)請(qǐng)求和標(biāo)準(zhǔn)的滾動(dòng)請(qǐng)求有四處不同:
- 不算分,關(guān)閉排序。結(jié)果會(huì)按照在索引中出現(xiàn)的順序返回。
- 不支持聚合
- 初始 search 請(qǐng)求的響應(yīng)不會(huì)在 hits 數(shù)組中包含任何結(jié)果。第一批結(jié)果就會(huì)按照第一個(gè) scroll 請(qǐng)求返回。
- 參數(shù) size 控制了每個(gè)分片上而非每個(gè)請(qǐng)求的結(jié)果數(shù)目,所以 size 為 10 的情況下,如果命中了 5 個(gè)分片,那么每個(gè) scroll 請(qǐng)求最多會(huì)返回 50 個(gè)結(jié)果。
如果你想支持打分,即使不進(jìn)行排序,將 track_scores 設(shè)置為 true。
保持搜索上下文存活
參數(shù) scroll (傳遞給 search 請(qǐng)求還有每個(gè) scroll 請(qǐng)求)告訴 Elasticsearch 應(yīng)該需要保持搜索上下文多久。這個(gè)值(比如說(shuō) 1m,詳情請(qǐng)見(jiàn)the section called “Time units)并不需要長(zhǎng)到可以處理所有的數(shù)據(jù)——僅僅需要足夠長(zhǎng)來(lái)處理前一批次的結(jié)果。每個(gè) scroll 請(qǐng)求(包含 scroll 參數(shù))設(shè)置了一個(gè)新的失效時(shí)間。
一般來(lái)說(shuō),背后的合并過(guò)程通過(guò)合并更小的分段創(chuàng)建更大的分段來(lái)優(yōu)化索引,同時(shí)會(huì)刪除更小的分段。這個(gè)過(guò)程在滾動(dòng)時(shí)進(jìn)行,但是一個(gè)打開(kāi)狀態(tài)的搜索上下文阻止了舊分段在使用的時(shí)候不會(huì)被刪除。這就是 Elasticsearch 能夠不管后續(xù)的文檔的變化,返回初始搜索請(qǐng)求的結(jié)果的原因。
保持舊的分段存活意味著會(huì)產(chǎn)生更多的文件句柄。確保你配置了節(jié)點(diǎn)有空閑的文件句柄。參考File Descriptors
你可以檢查有多少搜索上下文開(kāi)啟了,
curl -XGET localhost:9200/_nodes/stats/indices/search?pretty清除 scroll API
搜索上下文當(dāng) scroll 超時(shí)就會(huì)自動(dòng)移除。但是保持 scroll 存活需要代價(jià),如在前一節(jié)講的那樣,所以 scrolls 當(dāng)scroll不再被使用的時(shí)候需要被用 clear-scroll 顯式地清除:
curl -XDELETE localhost:9200/_search/scroll -d ' { "scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"] }'2.0.0-beta1 中加入。基于請(qǐng)求體的參數(shù)在 2.0.0 中加入。
多個(gè) scroll ID 可按照數(shù)據(jù)傳入:
curl -XDELETE localhost:9200/_search/scroll -d ' { "scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1", "aGVuRmV0Y2g7NTsxOnkxaDZ"] }'2.0.0 中加入。
所有搜索上下文可以通過(guò) _all 參數(shù)而清除:
curl -XDELETE localhost:9200/_search/scroll/_allscroll_id 也可以使用一個(gè)查詢字符串的參數(shù)或者在請(qǐng)求的body中傳遞。多個(gè)scroll ID 可以使用逗號(hào)分隔傳入:
curl -XDELETE localhost:9200/_search/scroll \ -d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1,aGVuRmV0Y2g7NTsxOnkxaDZ'轉(zhuǎn)載鏈接:https://www.jianshu.com/p/14aa8b09c789
總結(jié)
以上是生活随笔為你收集整理的elasticsearch 的滚动(scroll)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring几种获取 HttpServl
- 下一篇: 互联网广告系统综述一生态圈