首先、要做一個自己的企業內部搜素引擎呢,要認識Lucene:
1、Lucene的貢獻者Doug Cutting是一位自身全文索引/檢索專家,曾經是V-Twin搜索引擎(Apple的Copland操作系統的成就之一)的主要開發者,後在Excite擔任高級系統架構設計師,目前從事於一些INTERNET底層架構的研究。他貢獻出的Lucene的目標是爲各種中小型應用程序加入全文檢索功能。2001年年底成爲APACHE基金會jakarta的一個子項目。
2、Lucene是一個基於Java的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是爲你的應用程序提供索引和搜索功能。Lucene目前是Apache Jakarta家族中的一個開元項目,也是目前最爲流行的基於Java開元全文檢索工具包。
下面來開始Lucene的學習:
說到Java開發,首要步驟一般搜索去官方下載對應的開發包,這裏不再介紹,如果這點還做不到,就不用往下繼續了。因筆者才疏學淺,自己搞不了API,這裏就使用舊的 lucene-2.4.0 版本來學習。
新建一個Java項目工程,本節需要引入三個jar包 lucene-analyzers-2.4.1.jar、lucene-core-2.4.1.jar、lucene-highlighter-2.4.1.jar
- import java.io.StringReader;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.Token;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- public class TestLucene {
- public static void main(String[] args)throws Exception{
- Analyzer analyzer = new StandardAnalyzer(); //分析器
- TokenStream tokenStream = analyzer.tokenStream("", new StringReader("this is first lucene project"));
- Token token = new Token();
- while(null != tokenStream.next(token))
- System.out.println(token.term());
- }
- }
輸出結果:
- first
- lucene
- project
下面我們來看以下Lucene的核心索引類:
IndexWriter:建立索引的核心組件。使用IndexWriter可以新建一個索引並將對象文件逐一添加到索引當中,但不可以執行讀取和搜索操作。
Directory:代表一個lucene索引項的位置。這是一個抽象類,其具體實現有FSDirectory和RAMDirectory。前者將索引寫入硬盤,對應於真實的文件系統路徑,後者將索引寫入內存 ,相比於前者效率高但可用空較小。
Analyzer:對文本內容進行分析的抽象類,具體實現中有停用詞切除、詞幹分析、大小寫切換等功能。
Document:可以視爲文本經過處理後所對應的對象,由多個字段組成,如路徑、標題、摘要、修改日期等等。
Field:字段,對應於文本的某一部分數據,便於檢索時根據結果提取。
Filed使用:
- import org.apache.lucene.document.Field;
- public class TestField {
- public static void main(String[] args){
- Field field = new Field("fname", "fvalue", Field.Store.YES, Field.Index.ANALYZED);
- }
- }
Lucene與數據庫的類比
概念:
數據庫 Lucene
列/字段 Field
行/記錄 Document
操作:
查詢(SELECT) Searcher
添加(INSERT) IndexWriter.addDocument
刪除(DELETE) IndexReader.delete
修改(UPDATE) 不支持(可刪除後重新添加)
系統內容實現簡析:
設有兩篇文章1和2
文章1的內容爲:Tom lives in Guangzhou , I live in Guangzhou too .
文字2的內容爲:He once lived in Shanghai .
1)關鍵字處理,例如:lives - live (還原)。
在Lucene中有Analyzer類完成經過上面處理後
文章1的所有關鍵詞爲:[tom] [live] [i] [live] [guangzhou]
文章2的所有關鍵詞爲:[he] [live] [shanghai]
2)倒排索引
上面的對應關係是:“文章號“對”文章中所有關鍵詞“。倒排索引把這個關係倒過來,變成:”關鍵詞“對”擁有該關鍵詞的所有文章號“。
文章1,2經過倒排變成(關鍵詞 文章號)
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
3)加上”出現頻率“和”出現位置“信息後,我們的索引結構變爲:
關鍵詞 文章號 [出現頻率] 出現位置
guangzhou 1 [2] 3,6
he 2 [1] 1
i 1 [1] 4
live 1 [2],2 [1] 2,5,2
shanghai 2 [1] 3
tom 1 [1]
以live這行爲例我們說明一下該結構:live在文章1中出現了2詞,文章2中出現了一次,他的出現位置爲”2,5,2“這表示什麼呢?我們需要結合文章號和出現頻率來分析,文章1中出現了2詞,”2,5“就表示live在文章1中出現的兩個位置,文章2中出現了一次,剩下的”2“就表示live是文章2中第2個關鍵字。
原文地址:http://blog.csdn.net/shaopeng5211/article/details/8681863