如何解決Elasticsearch的深度翻頁問題

使用ES做搜索引擎拉取數(shù)據(jù)的時候音念,如果數(shù)據(jù)量太大,通過傳統(tǒng)的from + size的方式并不能獲取所有的數(shù)據(jù)(默認(rèn)最大記錄數(shù)10000),因為隨著頁數(shù)的增加,會消耗大量的內(nèi)存者祖,導(dǎo)致ES集群不穩(wěn)定。

ES提供了3中解決深度翻頁的操作绢彤,分別是scroll七问、sliced scroll 和 search after:

scroll

scroll api提供了一個全局深度翻頁的操作, 首次請求會返回一個scroll_id茫舶,使用該scroll_id可以順序獲取下一批次的數(shù)據(jù)械巡;scroll 請求不能用來做用戶端的實時請求,只能用來做線下大量數(shù)據(jù)的翻頁處理,例如數(shù)據(jù)的導(dǎo)出坟比、遷移和_reindex操作,還有同一個scroll_id無法并行處理數(shù)據(jù)嚷往,所以處理完全部的數(shù)據(jù)執(zhí)行時間會稍長一些葛账。

  • 例如我們使用scroll翻頁獲取包含elasticsearch的Twitter,那么首次請求的語句如下:
POST /twitter/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

其中scroll=1m是指scroll_id保留上下文的時間

  • 首次請求會返回一個scroll_id皮仁,我們根據(jù)這個值去不斷拉取下一頁直至沒有結(jié)果返回:
POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
}

針對scroll api下籍琳,同一個scroll_id無法并行處理數(shù)據(jù)的問題,es又推出了sliced scroll贷祈,與scroll api的區(qū)別是sliced scroll可以通過切片的方式指定多scroll并行處理趋急。

sliced scroll

sliced scroll api 除指定上下文保留時間外,還需要指定最大切片和當(dāng)前切片势誊,最大切片數(shù)據(jù)一般和shard數(shù)一致或者小于shard數(shù)呜达,每個切片的scroll操作和scroll api的操作是一致的:

GET /twitter/_search?scroll=1m
{
    "slice": {
        "id": 0, 
        "max": 2 
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
GET /twitter/_search?scroll=1m
{
    "slice": {
        "id": 1,
        "max": 2
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

因為支持并行處理,執(zhí)行時間要比scroll快很多粟耻。

search after

上面兩種翻頁的方式都無法支撐用戶在線高并發(fā)操作查近,search_after提供了一種動態(tài)指針的方案,即基于上一頁排序值檢索下一頁實現(xiàn)動態(tài)分頁:

  • 首次查詢
GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"date": "asc"},
        {"tie_breaker_id": "asc"}      
    ]
}

因為是動態(tài)指針挤忙,所以不需要像scroll api那樣指定上下文保留時間了

  • 通過上一頁返回的date + tie_breaker_id最后一個值做為這一頁的search_after:
GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "654323"],
    "sort": [
        {"_score": "desc"},
        {"tie_breaker_id": "asc"}
    ]
}

說白了 search_after 并沒有解決隨機(jī)跳頁查詢的場景霜威,但是可以支撐多query并發(fā)請求;search_after 操作需要指定一個支持排序且值唯一的字段用來做下一頁拉取的指針册烈,這種翻頁方式也可以通過bool查詢的range filter實現(xiàn)戈泼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赏僧,隨后出現(xiàn)的幾起案子大猛,更是在濱河造成了極大的恐慌,老刑警劉巖淀零,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎署,死亡現(xiàn)場離奇詭異,居然都是意外死亡窑滞,警方通過查閱死者的電腦和手機(jī)琼牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哀卫,“玉大人巨坊,你說我怎么就攤上這事〈烁模” “怎么了趾撵?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我占调,道長暂题,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任究珊,我火速辦了婚禮薪者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剿涮。我一直安慰自己言津,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布取试。 她就那樣靜靜地躺著悬槽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞬浓。 梳的紋絲不亂的頭發(fā)上初婆,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音猿棉,去河邊找鬼烟逊。 笑死,一個胖子當(dāng)著我的面吹牛铺根,可吹牛的內(nèi)容都是我干的宪躯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼位迂,長吁一口氣:“原來是場噩夢啊……” “哼访雪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎家乘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體精置,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年锣杂,在試婚紗的時候發(fā)現(xiàn)自己被綠了脂倦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡元莫,死狀恐怖赖阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踱蠢,我是刑警寧澤火欧,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響苇侵,放射性物質(zhì)發(fā)生泄漏赶盔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一榆浓、第九天 我趴在偏房一處隱蔽的房頂上張望于未。 院中可真熱鬧,春花似錦哀军、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柳击,卻和暖如春猿推,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捌肴。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工蹬叭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人状知。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓秽五,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饥悴。 傳聞我的和親對象是個殘疾皇子坦喘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354