elasticsearch 的滾動(dòng)(scroll)

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_idscroll 可以放在查詢字符串中傳遞。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)心順序。你可以通過組合 scrollscan 來關(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_typescan 可以關(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ù)目彭雾,所以 size10 的情況下碟刺,如果命中了 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'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坦康,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诡延,更是在濱河造成了極大的恐慌滞欠,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肆良,死亡現(xiàn)場(chǎng)離奇詭異筛璧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惹恃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門夭谤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巫糙,你說我怎么就攤上這事朗儒。” “怎么了参淹?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵醉锄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我浙值,道長(zhǎng)恳不,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任亥鸠,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘负蚊。我一直安慰自己神妹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布家妆。 她就那樣靜靜地躺著鸵荠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伤极。 梳的紋絲不亂的頭發(fā)上蛹找,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音哨坪,去河邊找鬼庸疾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛当编,可吹牛的內(nèi)容都是我干的届慈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼忿偷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼金顿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲤桥,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揍拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后茶凳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫂拴,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年慧妄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顷牌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞淹,死狀恐怖窟蓝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饱普,我是刑警寧澤运挫,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站套耕,受9級(jí)特大地震影響谁帕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冯袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一匈挖、第九天 我趴在偏房一處隱蔽的房頂上張望碾牌。 院中可真熱鬧,春花似錦儡循、人聲如沸舶吗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凡蚜。三九已至为障,卻和暖如春连茧,著一層夾襖步出監(jiān)牢的瞬間乏德,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工齿穗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傲隶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓缤灵,卻偏偏與公主長(zhǎng)得像伦籍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腮出,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理帖鸦,服務(wù)發(fā)現(xiàn),斷路器胚嘲,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • Neil Zhu作儿,簡(jiǎn)書ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist...
    朱小虎XiaohuZhu閱讀 4,561評(píng)論 1 2
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程馋劈,因...
    小菜c閱讀 6,365評(píng)論 0 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)攻锰、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評(píng)論 4 62
  • 第一次瀏覽《匹配度》的時(shí)候妓雾,我就覺得娶吞,這就是兩年前,Baozhu鼓動(dòng)我寫一本用戶研究的書械姻,我想寫成的樣子妒蛇。 書的名...
    楊蓉Dorothy閱讀 1,635評(píng)論 1 7