------------------------
1. Lucene介紹
Lucene的作者說過,Lucene只是一個高效的全文搜索引擎庫,而不是一個平臺,提供了非常簡單的API,使其可以滿足用戶對全文索引的需求。http://lucene.apache.org/java/docs/index.html
這裏可以下載到最新的Lucene庫,其中的wiki是一個不錯的學習的地方
http://wiki.apache.org/lucene-java/FrontPage?action=show&redirect=FrontPageEN
目前有很多網站和軟件用到了Lucene,如社交網站LinkedIn和蘋果的ITunes軟件中都用到了Lucene來做實時與全文索引。
2. Lucene架構包介紹
2.1 文檔的一個對象模型抽象庫 - Document
這個庫提供了索引文檔對象的一個抽象,所有的文檔對於Lucene來說都是一個Document抽象。Document => [Field1,Field2,...,FieldN]
Field => [Term1,Term2,...,TermN]
2.2 文本解析庫 - Analysis
這個庫是對文本進行解析,得到相應的Term對象,在Index與Searcher的時候都會用到,在索引過程中,它會對被索引的文件進行解析,而在搜索過程中,它會對查詢條件進行解析。2.3 索引庫 - Index
它主要是用來對文檔建立索引,對索引進行維護(更新索引,優化索引等),爲查詢提供訪問接口。2.4 存儲庫 - store
它主要是用來存儲索引內容的,這裏提供了兩種存儲方式,一種是磁盤存儲,另一個是內存存儲。2.5 查詢庫 - search
它主要是爲用戶提供查詢接口的,對用戶的查詢結果進行評估,並返回與用戶最相關的查詢信息。
2.6 工具庫 - util
主要是爲上面的庫提供一些I/O或者算法方法的工具類
3. 簡單的例子
當你下載了Lucene的可執行包後,會在contrib中有一箇中demo的目錄,其中就是對Lucene的簡單使用,下面對其進行相應的分析。3.1 索引
這裏的索引就是對文檔建立索引,以方便用戶查詢,我們看org.apache.lucene.demo.IndexFiles.java就是完成這樣的一個工作。下面我們來看一下它的主要的源代碼: //~1 這裏生成一個索引目錄
Directory dir = FSDirectory.open(new File(indexPath));
//~2 生成一個標準的分析器,如果你要用自己的分詞器,可以擴展Analyzer與Tokenizer類
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
//~3 這裏對索引進行配置
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
// 是索引建立一個新的索引還是進行增量索引
if (create) {
// Create a new index in the directory, removing any
// previously indexed documents:
iwc.setOpenMode(OpenMode.CREATE);
} else {
// Add new documents to an existing index:
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
}
// 配置索引的內存,以提高索引效率
// Optional: for better indexing performance, if you
// are indexing many documents, increase the RAM
// buffer. But if you do this, increase the max heap
// size to the JVM (eg add -Xmx512m or -Xmx1g):
//
// iwc.setRAMBufferSizeMB(256.0);
//~4 生成一個索引輸出類,用於寫了索引內容
IndexWriter writer = new IndexWriter(dir, iwc);
//~5 索引文檔
// 這裏主要是讀出要索引目錄中的文件,生成相應的抽象文檔對象,
// 然後調用IndexWriter的addDocument或者是updateDocuemtn來建立或者更新索引。
indexDocs(writer, docDir);
// 是否進行索引優化,
// NOTE: if you want to maximize search performance,
// you can optionally call optimize here. This can be
// a costly operation, so generally it's only worth
// it when your index is relatively static (ie you're
// done adding documents to it):
//
// writer.optimize();
//~6 關閉索引寫出器
writer.close();
3.2 查詢
這裏的查詢主要是對索引好的數據進行查詢操作,在org.apache.lucene.demo.SearchFiles.java中可以看到相應的查詢代碼,部分主要代碼如一下: //~1 生成一個索引查詢器,輸入爲索引目錄
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(index)));
//~2 生成一個查詢條件的分析器
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
//~3 生成一個查詢的分析器,主要是對查詢條件進行分析,生成相應的Query
QueryParser parser = new QueryParser(Version.LUCENE_31, field, analyzer);
//~4 對查詢條件進行分析,產生相應的Query對象
Query query = parser.parse(line);
System.out.println("Searching for: " + query.toString(field));
//~5 調用索引查詢對象的search方法進行索引查詢,得到查詢結果
TopDocs results = searcher.search(query, null, 100);