理解“query then fetch”和“dfs query then fetch”

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)翰铡。

理解“query then fetch”和“dfs query then fetch”

上篇文章中,我們遇到一個(gè)返回查詢結(jié)果相當(dāng)奇怪的情形唱捣。

上篇文章并沒有翻譯两蟀,請(qǐng)看原文。 :P

在此我們?cè)俳o出那個(gè)查詢的代碼:

$ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{
        "query": {
        "match_phrase_prefix": {
           "title": {
             "query": "d",
             "max_expansions": 5
           }
         }
       }
     }' | grep title

      "_score" : 1.0, "_source" : {"title":"drunk"}
      "_score" : 0.30685282, "_source" : {"title":"dzone"}
      "_score" : 0.30685282, "_source" : {"title":"data"}
      "_score" : 0.30685282, "_source" : {"title":"drive"}

為何文檔“drunk”分?jǐn)?shù)為1.0震缭,而其余的分?jǐn)?shù)是0.3赂毯?難道這些文檔不應(yīng)該是相同的分?jǐn)?shù)么,因?yàn)樗麄兌纪鹊仄ヅ淞恕癲”。答案是肯定的党涕,但是這個(gè)分?jǐn)?shù)本身也有比較合理的地方烦感。

相關(guān)性打分

ES使用的打分算法包含了稱之為“TF-IDF”的統(tǒng)計(jì)信息來幫助計(jì)算處于那個(gè)索引中的文檔的相關(guān)性。

TFIDF基本思想就是“一個(gè)項(xiàng)在文檔中出現(xiàn)的次數(shù)越多膛堤,那么這個(gè)文檔更加相關(guān)手趣;但相關(guān)性會(huì)被這個(gè)項(xiàng)在整個(gè)文檔庫(kù)中的次數(shù)削弱”。

稀有項(xiàng)出現(xiàn)在相對(duì)少的文檔中肥荔,那么任何查詢匹配了一個(gè)稀有項(xiàng)的相關(guān)性就變得很高绿渣。相反,平常項(xiàng)到處都有燕耿,他們的相關(guān)性就低了中符。

當(dāng)用戶執(zhí)行一個(gè)搜索時(shí),ES面對(duì)一個(gè)有趣的困境誉帅。你的查詢需要找到所有相關(guān)的文檔淀散,但是這些文檔分布在你的cluster中的任何數(shù)目的shard中。

每個(gè)shard是一個(gè)Lucene的索引蚜锨,保存了自身的TF和DF統(tǒng)計(jì)信息档插。一個(gè)shard只知道在其自身中出現(xiàn)的次數(shù),而非整個(gè)cluster亚再。

但是相關(guān)算法使用了TF-IDF郭膛,它需要知道對(duì)于整個(gè)索引的而不是對(duì)每個(gè)shard的TF和DF么?

默認(rèn)搜索類型:query then fetch

答案:是也不是针余。默認(rèn)情形下饲鄙,ES會(huì)使用一個(gè)稱之為Query then fetch的搜索類型。它運(yùn)作的方式如下:

  1. 發(fā)送查詢到每個(gè)shard
  2. 找到所有匹配的文檔圆雁,并使用本地的Term/Document Frequency信息進(jìn)行打分
  3. 對(duì)結(jié)果構(gòu)建一個(gè)優(yōu)先隊(duì)列(排序忍级,標(biāo)頁(yè)等)
  4. 返回關(guān)于結(jié)果的元數(shù)據(jù)到請(qǐng)求節(jié)點(diǎn)注意伪朽,實(shí)際文檔還沒有發(fā)送轴咱,只是分?jǐn)?shù)
  5. 來自所有shard的分?jǐn)?shù)合并起來,并在請(qǐng)求節(jié)點(diǎn)上進(jìn)行排序烈涮,文檔被按照查詢要求進(jìn)行選擇
  6. 最終朴肺,實(shí)際文檔從他們各自所在的獨(dú)立的shard上檢索出來
  7. 結(jié)果被返回給用戶

這個(gè)系統(tǒng)一般是能夠良好地運(yùn)作的。大多數(shù)情形下坚洽,你的索引有足夠的文檔來平滑Term/Document frequency統(tǒng)計(jì)信息戈稿。因此,盡管每個(gè)shard不一定擁有完整的關(guān)于整個(gè)cluster的frequency信息讶舰,結(jié)果仍然足夠好鞍盗,因?yàn)閒equency在每個(gè)地方基本上是類似的需了。

但是在我們開頭提起的那個(gè)查詢,默認(rèn)搜索類型有時(shí)候會(huì)失敗般甲。

dfs query then fetch

在上篇文章中肋乍,我們默認(rèn)建立了一個(gè)索引,ES通常使用5個(gè)shard敷存。接著插入了5個(gè)文檔進(jìn)入索引墓造,向ES發(fā)送請(qǐng)求返回相關(guān)結(jié)果和準(zhǔn)確的分?jǐn)?shù)。其結(jié)果并不是很公平锚烦,對(duì)吧觅闽?

這是由于默認(rèn)的搜索類型導(dǎo)致的,每個(gè)shard僅僅包含一個(gè)或者兩個(gè)文檔(ES使用hash確保隨機(jī)分布)挽牢。當(dāng)我們要求ES計(jì)算分?jǐn)?shù)時(shí)候谱煤,每個(gè)shard僅僅擁有關(guān)于五個(gè)文檔的一個(gè)很窄的視角摊求。所以分?jǐn)?shù)是不準(zhǔn)確的禽拔。

幸運(yùn)的是,ES并沒有讓你無(wú)所適從室叉。如果你遇到了這樣的打分偏離的情形睹栖,ES提供了一個(gè)稱為“DFS Query Then Fetch”。這個(gè)過程基本和Query Then Fetch類型茧痕,除了它執(zhí)行了一個(gè)預(yù)查詢來計(jì)算整體文檔的frequency野来。

  1. 預(yù)查詢每個(gè)shard,詢問Term和Document frequency
  2. 發(fā)送查詢到每隔shard
  3. 找到所有匹配的文檔踪旷,并使用全局的Term/Document Frequency信息進(jìn)行打分
  4. 對(duì)結(jié)果構(gòu)建一個(gè)優(yōu)先隊(duì)列(排序曼氛,標(biāo)頁(yè)等)
  5. 返回關(guān)于結(jié)果的元數(shù)據(jù)到請(qǐng)求節(jié)點(diǎn)注意令野,實(shí)際文檔還沒有發(fā)送舀患,只是分?jǐn)?shù)
  6. 來自所有shard的分?jǐn)?shù)合并起來,并在請(qǐng)求節(jié)點(diǎn)上進(jìn)行排序气破,文檔被按照查詢要求進(jìn)行選擇
  7. 最終聊浅,實(shí)際文檔從他們各自所在的獨(dú)立的shard上檢索出來
  8. 結(jié)果被返回給用戶

如果我們使用這個(gè)新的搜索類型,那么獲得的結(jié)果更加合理了(這些都一樣的):

$ curl -XGET 'localhost:9200/startswith/test/_search?pretty=true&search_type=dfs_query_then_fetch' -d '{
        "query": {
        "match_phrase_prefix": {
           "title": {
             "query": "d",
             "max_expansions": 5
           }
         }
       }
     }' | grep title

      "_score" : 1.9162908, "_source" : {"title":"dzone"}
      "_score" : 1.9162908, "_source" : {"title":"data"}
      "_score" : 1.9162908, "_source" : {"title":"drunk"}
      "_score" : 1.9162908, "_source" : {"title":"drive"}

結(jié)論

當(dāng)然现使,更好準(zhǔn)確性不是免費(fèi)的低匙。預(yù)查詢本身會(huì)有一個(gè)額外的在shard中的輪詢,這個(gè)當(dāng)然會(huì)有性能上的問題(跟索引的大小碳锈,shard的數(shù)量顽冶,查詢的頻率等)。在大多數(shù)情形下售碳,是沒有必要的强重,擁有足夠的數(shù)據(jù)可以解決這樣的問題佩迟。

但是有時(shí)候,你可能會(huì)遇到奇特的打分場(chǎng)景竿屹,在這些情況中报强,知道如何使用DFS query then fetch去進(jìn)行搜索執(zhí)行過程的微調(diào)還是有用的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拱燃,一起剝皮案震驚了整個(gè)濱河市秉溉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碗誉,老刑警劉巖召嘶,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異哮缺,居然都是意外死亡弄跌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門尝苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铛只,“玉大人,你說我怎么就攤上這事糠溜〈就妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵非竿,是天一觀的道長(zhǎng)蜕着。 經(jīng)常有香客問我,道長(zhǎng)红柱,這世上最難降的妖魔是什么承匣? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮锤悄,結(jié)果婚禮上韧骗,老公的妹妹穿的比我還像新娘。我一直安慰自己铁蹈,他們只是感情好宽闲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著握牧,像睡著了一般容诬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沿腰,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天览徒,我揣著相機(jī)與錄音,去河邊找鬼颂龙。 笑死习蓬,一個(gè)胖子當(dāng)著我的面吹牛纽什,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躲叼,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼芦缰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了枫慷?” 一聲冷哼從身側(cè)響起让蕾,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎或听,沒想到半個(gè)月后探孝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誉裆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年顿颅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片足丢。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粱腻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎桅,到底是詐尸還是另有隱情栖疑,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布滔驶,位于F島的核電站,受9級(jí)特大地震影響卿闹,放射性物質(zhì)發(fā)生泄漏揭糕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一锻霎、第九天 我趴在偏房一處隱蔽的房頂上張望著角。 院中可真熱鬧,春花似錦旋恼、人聲如沸吏口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)产徊。三九已至,卻和暖如春蜀细,著一層夾襖步出監(jiān)牢的瞬間舟铜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工奠衔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谆刨,地道東北人塘娶。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痊夭,于是被迫代替她去往敵國(guó)和親刁岸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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