Elasticsearch搜索過程解析

1.對(duì)已知文檔的搜索

如果被搜索的文檔(不論是單個(gè)文檔庙洼,還是批量文檔)能夠從主分片或任意一個(gè)副本分片中被檢索到,則與索引文檔過程相同镊辕,對(duì)已知文檔的搜索也會(huì)用到路由算法油够,Elasticsearch 中的路由算法如下所示:
Shard = hash(routing) % number_of_primary_shards

2.對(duì)未知文檔的搜索

除了對(duì)已知文檔的搜索外,大部分請(qǐng)求實(shí)際上是不知道查詢條件會(huì)命中哪些文檔的征懈。這些被查詢條件命中的文檔可能位于 Elasticsearch 集群中的任意位置上石咬。因此,搜索請(qǐng)求的執(zhí)行不得不去查詢每個(gè)索引中的每一個(gè)分片卖哎。

在 Elasticsearch 中鬼悠,搜索過程分為查詢階段(Query Pahse)和獲取階段(Fetch Phase)。
在查詢階段亏娜,查詢請(qǐng)求會(huì)廣播到索引中的每一個(gè)主分片和備份中焕窝,每一個(gè)分片都會(huì)在本地執(zhí)行檢索,并在本地各建立一個(gè)優(yōu)先級(jí)隊(duì)列(Priority Queue)维贺。該優(yōu)先級(jí)隊(duì)列是一份根據(jù)文檔相關(guān)度指標(biāo)進(jìn)行排序的列表它掂,列表的長度由 from 和 size 兩個(gè)分頁參數(shù)決定。
查詢階段可以再細(xì)分成3個(gè)小的子階段:
(1)客戶端發(fā)送一個(gè)檢索請(qǐng)求給某個(gè)節(jié)點(diǎn)A溯泣,此時(shí)節(jié)點(diǎn)A會(huì)創(chuàng)建一個(gè)空的優(yōu)先級(jí)隊(duì)列虐秋,并配置好分頁參數(shù)from與size。
(2)節(jié)點(diǎn)A將搜索請(qǐng)求發(fā)送給該索引中的每一個(gè)分片垃沦,每個(gè)分片在本地執(zhí)行檢索客给,并將結(jié)果添加到本地優(yōu)先級(jí)隊(duì)列中。
(3)每個(gè)分片返回本地優(yōu)先級(jí)序列中所記錄的ID與sort值肢簿,并發(fā)送給節(jié)點(diǎn)A靶剑。節(jié)點(diǎn)A將這些值合并到自己的本地優(yōu)先級(jí)隊(duì)列中,并做出全局的排序译仗。
在獲取階段抬虽,主要是基于上一階段找到所要搜索文檔的具體位置匿垄,將文檔數(shù)據(jù)內(nèi)容取回并返回給客戶端肉渴。

在Elasticsearch中,默認(rèn)的搜索類型就是上面介紹的Query then Fetch突梦。上述描述運(yùn)作方式就是Query then Fetch咱圆。Query then Fetch有可能會(huì)出現(xiàn)打分偏離的情形笛辟,幸好功氨,Elasticsearch還提供了一個(gè)稱為"DFS Query then Fetch"的搜索方式,它和Query then Fetch基本相同手幢,但是它會(huì)執(zhí)行一個(gè)查詢來計(jì)算整體文檔的frequency捷凄。其處理過程如下所示:
(1)預(yù)查詢每個(gè)分片,詢問Term和Document Frequency等信息围来。
(2)發(fā)送查詢請(qǐng)求到每個(gè)分片跺涤。
(3)找到各個(gè)分片中所有匹配的文檔,并使用全局的Term/Document Frequency信息進(jìn)行打分监透。在執(zhí)行過程中依然需要對(duì)結(jié)果構(gòu)建一個(gè)優(yōu)先隊(duì)列桶错,如排序等。
(4)返回關(guān)于結(jié)果的元數(shù)據(jù)到請(qǐng)求節(jié)點(diǎn)胀蛮。需要指出的是院刁,此時(shí)實(shí)際文檔還沒有發(fā)送到請(qǐng)求節(jié)點(diǎn),發(fā)送的只是分?jǐn)?shù)粪狼。
(5)請(qǐng)求節(jié)點(diǎn)將來自所有分片的分?jǐn)?shù)合并起來退腥,并在請(qǐng)求節(jié)點(diǎn)上進(jìn)行排序,文檔被按照查詢要求進(jìn)行選擇再榄。最終狡刘,實(shí)際文檔從它們各自所在的獨(dú)立的分片上被檢索出來,結(jié)果被返回給讀者困鸥。

3.對(duì)詞條的搜索

具體到一個(gè)分片颓帝,ELasticsearch是如何按照詞條進(jìn)行進(jìn)行搜索的呢?
當(dāng)詞條數(shù)量較少時(shí)窝革,我們可以順序遍歷詞條獲取結(jié)果,但如果詞條有成千上萬個(gè)時(shí)吕座,Elasticsearch為了能快速找到某個(gè)詞條虐译,它對(duì)所有的詞條都進(jìn)行了排序,隨后使用二分法查找詞條吴趴,其查找效率為log(N)漆诽。這個(gè)過程就像查字典一樣,因此排序詞條的集合也稱為Term Dictionary锣枝。
為了提高查詢性能厢拭,Elasticsearch直接通過內(nèi)存查找詞條,而非從磁盤中讀取撇叁。但當(dāng)詞條太多時(shí)供鸠,顯然Term Dictionary也會(huì)很大,此時(shí)全部放在內(nèi)存有些不現(xiàn)實(shí)陨闹,于是引入了Term Index楞捂。
Term Index就像字典中的索引頁薄坏,其中的內(nèi)容如字母A開頭的有哪些詞條,這些詞條分別在哪頁寨闹。通過Term Index,Elasticsearch也可以快速定位到Term Dictionary的某個(gè)OffSet(位置偏移)胶坠,然后從這個(gè)位置再往后順序查找。
前面提及了單個(gè)詞條的搜索方法繁堡,而在實(shí)際應(yīng)用中沈善,更常見的往往是多個(gè)詞條拼接程的"聯(lián)合查詢"。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末椭蹄,一起剝皮案震驚了整個(gè)濱河市闻牡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塑娇,老刑警劉巖澈侠,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異埋酬,居然都是意外死亡哨啃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門写妥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拳球,“玉大人,你說我怎么就攤上這事珍特∽>” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扎筒,是天一觀的道長莱找。 經(jīng)常有香客問我,道長嗜桌,這世上最難降的妖魔是什么奥溺? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮骨宠,結(jié)果婚禮上浮定,老公的妹妹穿的比我還像新娘。我一直安慰自己层亿,他們只是感情好桦卒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匿又,像睡著了一般方灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琳省,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天迎吵,我揣著相機(jī)與錄音躲撰,去河邊找鬼。 笑死击费,一個(gè)胖子當(dāng)著我的面吹牛拢蛋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔫巩,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谆棱,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了圆仔?” 一聲冷哼從身側(cè)響起垃瞧,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坪郭,沒想到半個(gè)月后个从,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歪沃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嗦锐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪曙。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奕污,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出液走,到底是詐尸還是另有隱情碳默,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布缘眶,位于F島的核電站嘱根,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巷懈。R本人自食惡果不足惜儿子,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砸喻。 院中可真熱鬧,春花似錦蒋譬、人聲如沸割岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癣漆。三九已至,卻和暖如春剂买,著一層夾襖步出監(jiān)牢的瞬間惠爽,已是汗流浹背癌蓖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婚肆,地道東北人租副。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像较性,于是被迫代替她去往敵國和親用僧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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