Lucene初識

Lucene是一種高性能、可伸縮的信息搜索(IR)庫锡宋,在2000年開源,最初由鼎鼎大名的Doug Cutting開發(fā)咐容,是基于Java實現(xiàn)的高性能的開源項目。Lucene采用了基于倒排表的設(shè)計原理撞鹉,可以非常高效地實現(xiàn)文本查找疟丙,在底層采用了分段的存儲模式颖侄,使它在讀寫時幾乎完全避免了鎖的出現(xiàn),大大提升了讀寫性能享郊。

核心模塊

Lucene的寫流程和讀流程如圖1所示览祖。


1. Lucene讀寫流程圖

其中,虛線箭頭(A炊琉、B展蒂、C、D)表示寫索引的主要過程苔咪,實線箭頭(1-9)表示查詢的主要過程锰悼。
Lucene中的主要模塊(見圖1)及模塊說明如下。

  • analysis模塊:主要負(fù)責(zé)詞法分析及語言處理团赏,也就是我們常說的分詞箕般,通過該模塊可最終形成存儲或者搜索的最小單元Term。
  • index模塊:主要負(fù)責(zé)索引的創(chuàng)建工作舔清。
  • store模塊:主要負(fù)責(zé)索引的讀寫丝里,主要是對文件的一些操作,其主要目的是抽象出和平臺文件系統(tǒng)無關(guān)的存儲体谒。
  • queryParser:主要負(fù)責(zé)語法分析杯聚,把我們的查詢語句生成Lucene底層可以識別的條件。
  • search模塊:主要負(fù)責(zé)對索引的搜索工作抒痒。
  • similarity模塊:主要負(fù)責(zé)相關(guān)性打分和排序的實現(xiàn)幌绍。

核心術(shù)語

下面介紹Lucene中的核心術(shù)語。

  • Term:是索引里最小的存儲和查詢單元故响,對于英文來說一般指一個單詞傀广,對于中文來說一般指一個分詞后的詞彩届。
  • 詞典(Term Dictionary,也叫作字典):是Term的集合。詞典的數(shù)據(jù)結(jié)構(gòu)可以有很多種丰捷,每種都有自己的優(yōu)缺點坯墨,比如:排序數(shù)組通過二分查找來檢索數(shù)據(jù)病往;HashMap(哈希表)比排序數(shù)組的檢索速度更快,但是會浪費存儲空間停巷;fst(finite-state transducer)有更高的數(shù)據(jù)壓縮率和查詢效率耍攘,因為詞典是常駐內(nèi)存的蕾各,而fst有很好的壓縮率,所以fst在Lucene的新版本中有非常多的使用場景妨托,也是默認(rèn)的詞典數(shù)據(jù)結(jié)構(gòu)吝羞。
  • 倒排表(Posting List):一篇文章通常由多個詞組成钧排,倒排表記錄的是某個詞在哪些文章中出現(xiàn)過恨溜。
  • 正向信息:原始的文檔信息,可以用來做排序柏腻、聚合五嫂、展示等沃缘。
  • 段(segment):索引中最小的獨立存儲單元。一個索引文件由一個或者多個段組成则吟。在Lucene中的段有不變性,也就是說段一旦生成水慨,在其上只能有讀操作晰洒,不能有寫操作谍珊。

Lucene的底層存儲格式如圖2所示急侥。圖2由詞典和倒排表兩部分組成,其中的詞典就是Term的集合绊茧。詞典中的Term指向的文檔鏈表的集合按傅,叫作倒排表唯绍。詞典和倒排表是Lucene中很重要的兩種數(shù)據(jù)結(jié)構(gòu)况芒,是實現(xiàn)快速檢索的重要基石叶撒。詞典和倒排表是分兩部分存儲的祠够,在倒排表中不但存儲了文檔編號古瓤,還存儲了詞頻等信息落君。

2.詞典和倒排表

在圖2所示的詞典部分包含三個詞條(Term):elasticsearch绎速、lucene和solr纹冤。詞典數(shù)據(jù)是查詢的入口萌京,所以這部分?jǐn)?shù)據(jù)是以fst的形式存儲在內(nèi)存中的枫夺。
在倒排表中绘闷,“l(fā)ucene”指向有序鏈表3,7,15,30,35,67,表示字符串“l(fā)ucene”在文檔編號為3丑勤、7法竞、15岔霸、30呆细、35八匠、67的文章中出現(xiàn)過梨树,elasticsearch和solr同理抡四。

檢索方式

在Lucene的查詢過程中的主要檢索方式有以下四種床嫌。

  1. 單個詞查詢
    指對一個Term進行查詢厌处。比如,若要查找包含字符串“l(fā)ucene”的文檔缆娃,則只需在詞典中找到Term“l(fā)ucene”贯要,再獲得在倒排表中對應(yīng)的文檔鏈表即可崇渗,如圖3所示宅广。


    3. 單個詞查詢
  2. AND
    指對多個集合求交集跟狱。比如驶臊,若要查找既包含字符串“l(fā)ucene”又包含字符串“solr”的文檔关翎,則查找步驟如下笤休。
  • 在詞典中找到Term“l(fā)ucene”店雅,得到“l(fā)ucene”對應(yīng)的文檔鏈表。
  • 在詞典中找到Term“solr”沮明,得到“solr”對應(yīng)的文檔鏈表荐健。
  • 合并鏈表江场,對兩個文檔鏈表做交集運算址否,合并后的結(jié)果既包含“l(fā)ucene”佑附,也包含“solr”音同。如圖4所示秃嗜。


    4. AND查詢
  1. OR
    指對多個集合求并集叽赊。比如蛇尚,若要查找包含字符串“l(fā)ucene”或者包含字符串“solr”的文檔取劫,則查找步驟如下谱邪。
  • 在詞典中找到Term“l(fā)ucene”惦银,得到“l(fā)ucene”對應(yīng)的文檔鏈表末誓。
  • 在詞典中找到Term“solr”喇澡,得到“solr”對應(yīng)的文檔鏈表晴玖。
  • 合并鏈表呕屎,對兩個文檔鏈表做并集運算秀睛,合并后的結(jié)果包含“l(fā)ucene”或者包含“solr”琅催,如圖5所示藤抡。


    5. OR查詢
  1. NOT
    指對多個集合求差集缠黍。比如,若要查找包含字符串“solr”但不包含字符串“l(fā)ucene”的文檔语泽,則查找步驟如下踱卵。
  • 在詞典中找到Term“l(fā)ucene”惋砂,得到“l(fā)ucene”對應(yīng)的文檔鏈表西饵。
  • 在詞典中找到Term“solr”眷柔,得到“solr”對應(yīng)的文檔鏈表驯嘱。
  • 合并鏈表宙拉,對兩個文檔鏈表做差集運算谢澈,用包含“solr”的文檔集減去包含“l(fā)ucene”的文檔集锥忿,運算后的結(jié)果就是包含“solr”但不包含“l(fā)ucene”敬鬓,如圖6所示钉答。


    6. NOT查詢

通過上述四種查詢方式数尿,我們不難發(fā)現(xiàn)右蹦,由于Lucene是以倒排表的形式存儲的何陆,所以在Lucene的查找過程中只需在詞典中找到這些Term贷盲,根據(jù)Term獲得文檔鏈表慨灭,然后根據(jù)具體的查詢條件對鏈表進行交球及、并吃引、差等操作镊尺,就可以準(zhǔn)確地查到我們想要的結(jié)果庐氮,相對于在關(guān)系型數(shù)據(jù)庫中的“l(fā)ike”查找要做全表掃描來說弄砍,這種思路是非常高效的音婶。雖然在索引創(chuàng)建時要做很多工作衣式,但這種一次生成碴卧、多次使用的思路也是非常高明的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末界弧,一起剝皮案震驚了整個濱河市垢箕,隨后出現(xiàn)的幾起案子条获,更是在濱河造成了極大的恐慌帅掘,老刑警劉巖修档,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥邻,死亡現(xiàn)場離奇詭異兴使,居然都是意外死亡,警方通過查閱死者的電腦和手機俩垃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門赏淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來六水,“玉大人掷贾,你說我怎么就攤上這事想帅「圩迹” “怎么了浅缸?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵蚌父,是天一觀的道長苟弛。 經(jīng)常有香客問我膏秫,道長荔睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮婿斥,結(jié)果婚禮上民宿,老公的妹妹穿的比我還像新娘活鹰。我一直安慰自己志群,他們只是感情好锌云,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布彬向。 她就那樣靜靜地躺著娃胆,像睡著了一般缕棵。 火紅的嫁衣襯著肌膚如雪招驴。 梳的紋絲不亂的頭發(fā)上别厘,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天触趴,我揣著相機與錄音,去河邊找鬼渴肉。 笑死冗懦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仇祭。 我是一名探鬼主播披蕉,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼没讲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礁苗,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤爬凑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后试伙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁信,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年疏叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了吱抚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡考廉,死狀恐怖秘豹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昌粤,我是刑警寧澤既绕,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布啄刹,位于F島的核電站,受9級特大地震影響凄贩,放射性物質(zhì)發(fā)生泄漏誓军。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一疲扎、第九天 我趴在偏房一處隱蔽的房頂上張望昵时。 院中可真熱鬧,春花似錦椒丧、人聲如沸壹甥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽句柠。三九已至,卻和暖如春棒假,著一層夾襖步出監(jiān)牢的瞬間溯职,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工帽哑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谜酒,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓妻枕,卻偏偏與公主長得像僻族,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佳头,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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

  • 原文鏈接# Lucene學(xué)習(xí)總結(jié)之一:全文檢索的基本原理,這是我遇見最好的入門晴氨,近10年前的文章如今讀來依然讓人耳...
    囧雪啥都不知道閱讀 885評論 4 0
  • 1. 案例分析:什么時全文檢索康嘉,如何實現(xiàn)全文檢索 ? 1.1 案例 ? 實現(xiàn)一個文件的搜索功能,通過關(guān)鍵字搜索文件...
    東方舵手閱讀 1,184評論 0 1
  • Solr&ElasticSearch原理及應(yīng)用 一籽前、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,305評論 1 17
  • 松槳撥動的 不只是海水 還有一個江南女子的 心懷 你自踏水翩翩 不惜 踩碎我一船淺夢 我只恨 你一個決絕的眼神 便...
    伊人擺渡閱讀 186評論 2 1