Neil Zhu,簡(jiǎn)書ID Not_GOD懂讯,University AI 創(chuàng)始人 & Chief Scientist荷憋,致力于推進(jìn)世界人工智能化進(jìn)程。制定并實(shí)施 UAI 中長(zhǎng)期增長(zhǎng)戰(zhàn)略和目標(biāo)褐望,帶領(lǐng)團(tuán)隊(duì)快速成長(zhǎng)為人工智能領(lǐng)域最專業(yè)的力量勒庄。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國(guó)最早的人工智能社團(tuán)), DL Center(深度學(xué)習(xí)知識(shí)中心全球價(jià)值網(wǎng)絡(luò))瘫里,AI growth(行業(yè)智庫(kù)培訓(xùn))等实蔽,為中國(guó)的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外谨读,他還參與或者舉辦過各類國(guó)際性的人工智能峰會(huì)和活動(dòng)局装,產(chǎn)生了巨大的影響力,書寫了60萬(wàn)字的人工智能精品技術(shù)內(nèi)容劳殖,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門書《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》铐尚,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號(hào)和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國(guó)內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程哆姻,均受學(xué)生和老師好評(píng)宣增。
Scroll
search
請(qǐng)求返回一個(gè)單一的結(jié)果“頁(yè)”,而 scroll
API 可以被用來檢索大量的結(jié)果(甚至所有的結(jié)果)矛缨,就像在傳統(tǒng)數(shù)據(jù)庫(kù)中使用的游標(biāo) cursor爹脾。
滾動(dòng)并不是為了實(shí)時(shí)的用戶響應(yīng),而是為了處理大量的數(shù)據(jù)箕昭,例如灵妨,為了使用不同的配置來重新索引一個(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 來檢索下一個(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è)批次知道沒有更多的結(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è)轧邪,比如說 ?size=10&from=10000
是非常低效的,因?yàn)?100,000
排序的結(jié)果必須從每個(gè)分片上取出并重新排序最后返回 10
條羞海。這個(gè)過程需要對(duì)每個(gè)請(qǐng)求頁(yè)重復(fù)忌愚。
scroll
API 保持了哪些結(jié)果已經(jīng)返回的記錄,所以能更加高效地返回排序的結(jié)果却邓。但是硕糊,按照默認(rèn)設(shè)定排序結(jié)果仍然需要代價(jià)。
一般來說腊徙,你僅僅想要找到結(jié)果简十,不關(guān)心順序。你可以通過組合 scroll
和 scan
來關(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è)值(比如說 1m
,詳情請(qǐng)見the section called “Time units)并不需要長(zhǎng)到可以處理所有的數(shù)據(jù)——僅僅需要足夠長(zhǎng)來處理前一批次的結(jié)果做葵。每個(gè) scroll
請(qǐng)求(包含 scroll
參數(shù))設(shè)置了一個(gè)新的失效時(shí)間占哟。
一般來說,背后的合并過程通過合并更小的分段創(chuàng)建更大的分段來優(yōu)化索引,同時(shí)會(huì)刪除更小的分段榨乎。這個(gè)過程在滾動(dòng)時(shí)進(jìn)行怎燥,但是一個(gè)打開狀態(tài)的搜索上下文阻止了舊分段在使用的時(shí)候不會(huì)被刪除。這就是 Elasticsearch 能夠不管后續(xù)的文檔的變化蜜暑,返回初始搜索請(qǐng)求的結(jié)果的原因铐姚。
保持舊的分段存活意味著會(huì)產(chǎn)生更多的文件句柄。確保你配置了節(jié)點(diǎn)有空閑的文件句柄史煎。參考File Descriptors
你可以檢查有多少搜索上下文開啟了谦屑,
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 中加入。
所有搜索上下文可以通過 _all
參數(shù)而清除:
curl -XDELETE localhost:9200/_search/scroll/_all
scroll_id
也可以使用一個(gè)查詢字符串的參數(shù)或者在請(qǐng)求的body中傳遞袍患。多個(gè)scroll ID 可以使用逗號(hào)分隔傳入:
curl -XDELETE localhost:9200/_search/scroll \ -d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1,aGVuRmV0Y2g7NTsxOnkxaDZ'