Lucene 最全詳解 -萬字圖文總結-
Lucene 是一個高效的基於 Java 的全文檢索庫,理解 Lucene 原理更容易掌握好 Lucene 搜索,下面我全面來詳解 Lucene@mikechen
全文檢索原理
Lucene 是一個高效的基於 Java 的全文檢索庫,所以在瞭解 Lucene 之前要費一番工夫瞭解一下全文檢索,這是 Lucene 原理的核心。
全文檢索它的工作原理:就是是計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置。
當用戶查詢時,檢索程序就根據事先建立的索引進行查找,並將查找的結果反饋給用戶的檢索方式,這就是全文檢索。
舉一個例子:就拿新華字典做比喻,假設字典沒有索引頁,你要找一個字的解釋你就得一頁一頁翻,直到找到爲止,這效率可想而知。
現在有了索引頁,就可以根據拼音首字母,或偏旁部首快速定位到目標字在哪一頁,這個索引頁,就是全文檢索核心。
全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
全文檢索大體分三個過程,索引創建、索引存儲、以及搜索索引。
索引創建
將現實世界中所有的結構化和非結構化數據提取信息,這個信息提取的過程,就是索引創建。
結構化和非結構化數據
1. 結構化數據
結構化數據:指具有固定格式,或有限長度的數據,如數據庫,元數據等。
對於結構化數據,我們一般都是可以通過關係型數據庫,比如:mysql,oracle 等表 的方式存儲和搜索,也可以建立索引。
2. 非結構化數據
非結構化數據:指不定長。或無固定格式的數據,比如:郵件,word 、pdf 文檔、HTML 這類具有一定規則的非結構化數據。
在非結構化數據中,將一部分結構化信息抽取出來,重新組織,然後針對這部分有結構的數據,進行索引建立從而達到加速查詢的目的。
比如最典型的代表,就是:Google、百度等搜索引擎按照詞爲單位,把 HTML 網頁存入索引庫,然後用戶查詢詞,就會從索引庫獲取到想要的結果。
這種方式就構成了全文檢索的基本思路,這部分從非結構化數據,比如:按照網頁爲單位中提取出網頁標題的關鍵詞,然後重新組織的信息,我們稱之索引。
倒排索引
上面談了全文檢索技術的原理,下面談談全文檢索技術的具體實現,絕大多數都基於倒排索引來做,所以要理解 Lucene 原理,需要掌握倒排索引。
要了解倒排索引,先看一下什麼是正排索引。
1. 正排索引
所謂正排索引,就是以文檔對象的唯一 ID 作爲索引,以文檔內容作爲記錄,和我們人腦的記憶更加貼合的一種數據結構。
舉一個生活中的例子:記憶古詩,當別人問我們《靜夜思》這首詩的時候,我們很容易就能夠背出完整的詩句。
但是如果有人問我們哪一首詩裏面,包含有霜這個字的時候,我們就很難想到《靜夜思》這首詩了,因爲我們的大腦在記憶古詩的時候是建立了一個正排索引。
正排索引就是:輸入靜夜思,然後出現 “窗前明月光,疑是地上霜,舉頭望明月,低頭思故鄉”,大腦記憶古詩的這個順序,這就是正排索引。
2. 倒排索引
而倒排索引是與這樣的數據結構相反的,有一個從古代流傳至今的遊戲,叫做《飛花令》,規則就是要能夠說出含有 “花” 的詩句,誰能夠說的多誰就獲勝。
倒排索引就是當用戶在搜索引擎搜索框中輸入關鍵詞的時候,搜索引擎就會把和關鍵詞有關的頁面展現給用戶,而這個過程就叫做倒排索引,這個與上面詩句的例子類似。
倒排索引是將文檔內容中的單詞作爲索引,將包含該詞的文檔 ID 作爲記錄。
如下圖所示:
舉一個例子,手機查詢,原始數據如下:
然後,通過分詞產生倒排索引表,如下所示:
倒排索引進行分組,根據’華爲’、’榮耀’、’手機’分組,這就是倒排索引。
倒排索引和正排索引的區別
正排索引是通過文檔找單詞,既 key 找 value,倒排索引是通過單詞找文檔,既 value 找 key,這就是兩者最大的區別。
倒排索引到此也就講清楚了,你只要理解了倒排索引這個過程,對搜索引擎就有一個整體的瞭解了。
索引存儲
索引創建好後,下一步就是索引存儲。
以 Lucene 爲例,Lucene 的存儲結構,如下圖所示:
從大到小是:Index -> Segment -> Doc -> Field -> Term,類比 MySQL 爲 Database -> Table -> Record -> Field -> Value。
搜索索引
理解了索引的創建過程,最後一步就是搜索索引的查詢。
查詢索引做了哪些事情?
查詢索引主要分爲如下 4 大步驟:
第一步:對查詢內容進行詞法分析
舉個例子,用戶輸入語句:lucene AND learned NOT hadoop,說明用戶想找一個包含 lucene 和 learned,然而不包括 hadoop 的文檔。
這裏的 AND 以及 NOT 這些分析,這就是詞法和語法分析,類似關係數據庫 oracle、mysql 中 sql 的意義。
第二步:搜索索引
搜索索引:就是去索引庫中找到滿足查詢條件的索引列表。
這裏大致分爲如下 3 步:
首先:在反向索引表中,分別找出包含 lucene,learn,hadoop 的文檔鏈表。
其次:對包含 lucene,learn 的鏈表進行合併操作,得到既包含 lucene 又包含 learn 的文檔鏈表。
最後:將此鏈表與 hadoop 的文檔鏈表進行差操作,去除包含 hadoop 的文檔,從而得到既包含 lucene 又包含 learn 而且不包含 hadoop 的文檔鏈表。
第三步:內容排序
計算權重對返回內容排序,影響一個詞 (Term) 在一篇文檔中的重要性主要有兩個因素:
Term Frequency (tf):即此 Term 在此文檔中出現了多少次,tf 越大說明越重要。
Document Frequency (df):即有多少文檔包含次 Term,df 越大說明越不重要。
Lucene 原理總結
最後配一張圖來加強下對創建索引和查詢索引的理解:
首先通過分詞,通過詞法分析索引創建,然後索引存儲,最後搜索索引查詢,這就是 Lucene 原理。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/YAvos5SNbZQhnzcniyEzIg