一、全文搜尋
全文搜尋是指計算機搜尋程式通過掃描文章中的每一個詞,對每一個詞建立一個索引, 指明該詞在文中出現的次數和位置,當使用者查詢時,搜尋程式就根據事先建立的索引進行查找,并将查找的結果回報給使用者。這個過程類似于通過字典中的搜尋字表查字的過程,Lucene是目前全球使用最廣的全文搜尋引擎開源庫。
二、Lucene反向索引
反向索引源于實際應用中需要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的位址,由于不是由記錄來确定屬性值,而是由屬性值來确定記錄的位置,因而稱為反向索引(inverted index)。
帶有反向索引的檔案我們稱為反向索引檔案,簡稱倒排檔案(inverted file)。
反向索引中的索引對象是文檔或者文檔集合中的單詞等,用來存儲這些單詞在一個文檔或者一組文檔中的存儲位置,是對文檔或者文檔集合的一種最常用的索引機制。搜尋引擎的關鍵步驟就是建立反向索引,反向索引一般表示為一個關鍵詞,然後是它的頻度(出現的次數)、位置(出現在哪一篇文章或網頁中,及有關的日期,作者等資訊),好比一本書的目錄、标簽一般讀者想看哪一個主題相關的章節,直接根據目錄即可找到相關的頁面。不必再從書的第一頁到最後一頁,一頁一頁地查找。
三、反向索引建立過程
假設有兩篇文章1和文章2。
文章1的内容為:
Tony lives in chongqing, I live in chongqing too.
文章2的内容為:
He once lived in shanghai.
取關鍵詞
由于Lucene是基于關鍵詞索引和查詢的,首先要取得這兩篇文章的關鍵詞,通常需要如下處理措施:
- 現在有的是文章内容,即一個字元串,先要找出字元串中的所有單司,即分詞。
- 英文單詞由于用空格分隔,比較好處理。中文單詞間由于是連在一起的,是以需要特殊的分詞處理。
- 文章中的“in” “once” “too”等詞沒有什麼實際意義,中文中的“的” “是”等字通常也無具體含義,這些不代表概念的詞是可以過濾掉的。
- 使用者通常希望查“He”時能把含“he”和“HE”的文章也找出來,是以所有單詞 需要統一大小寫:
- 使用者通常希望查“live”時能把含“lives”和“lived”的文章也找出來,是以需要 把 “lives”,“lived” 還原成 “live” 。
- 文章中的标點符号通常不表示某種概念,也可以過濾掉。
在Lucene中以上措施由Analyzer類完成。經過上面處理後,得到如下結果:
文章1的所有關鍵詞為:
[tony] [live] [chongqing] [i] [live] [chongqing]
文章2的所有關鍵詞為:
[he] [live] [shanghai]
文章1和文章2經過倒排後的對應關系
關鍵詞 | 文章号 |
---|---|
tony | 1 |
live | 1,2 |
chongqing | 1 |
i | 1 |
he | 2 |
shanghai | 1,2 |
反向索引關鍵詞頻率位置
關鍵詞 | 文章好[出現頻率] | 出現位置 |
---|---|---|
tony | 1[1] | 1 |
live | 1[2] | 2,5 |
2[1] | 2 | |
chongqing | 1[2] | 3,6 |
i | 1[1] | 4 |
he | 2[1] | 1 |
shanghai | 2[1] | 3 |
出現位置是指在關鍵詞中的位置。