Lucene使用指南
Lucene簡介
Lucene是一個基于Java的、高性能的全文檢索工具包,它目前是著名的 Apache Jakarta 家族中的一個開源項目,也是目前最為流行的基于 Java 開源全文檢索工具包。但它不是一個完整的搜尋應用程式,而是為應用程式提供索引和搜尋功能。
Lucene 是為文本類型的資料建立索引的,是以隻要能把需要索引的資料格式轉化的文本的,Lucene 就能對文檔進行索引和搜尋。比如HTML、PDF,都可以轉換文本再交給Lucene進行索引。
1. Lucene環境
1.1 Lucene版本
目前版本:取目前最新版本Lucene Core 3.4.0
下載下傳位址:http://lucene.apache.org/java/docs/index.html
linux版本: lucene-3.4.0.tgz
windows版本:lucene-3.4.0.zip
1.2 IKAnalyzer中文分詞器
Lucene的分詞器以接口Analyzer的形式對外提供,外部根據業務需要實作該分詞器。Lucene本身提供了标準分詞器StandarAnalyzer,針對英文的分詞。
中文分詞器現在比較成熟的是開源項目的IKAnalyzer,是針對中文的分詞, 目前最新版本是IKAnalyzer3.2.8.jar
下載下傳位址: http://code.google.com/p/ik-analyzer/downloads/list
2. Lucene和應用程式的關系

3. Lucene API使用
3.1 建立索引
為了對文檔進行索引,Lucene 提供了五個基礎的類,他們分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分别介紹一下這五個類的用途:
Document
Document 是用來描述文檔的,這裡的文檔可以指一個 HTML 頁面,一封電子郵件,或者是一個文本檔案。一個 Document對象由多個 Field 對象組成的。可以把一個 Document 對象想象成資料庫中的一個記錄,而每個 Field 對象就是記錄的一個字段。
Field
Field 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的标題和内容可以用兩個 Field 對象分别描述。
Analyzer
在一個文檔被索引之前,首先需要對文檔内容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實作。針對不同的語言和應用需要選擇适合的 Analyzer。Analyzer 把分詞後的内容交給 IndexWriter 來建立索引。
IndexWriter
IndexWriter 是 Lucene 用來建立索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。
Directory
這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實作,第一個是 FSDirectory,它表示一個存儲在檔案系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在記憶體當中的索引的位置。
使用例子
public void createIndexs() throws Exception { String indexDir = "d:\\Temp\\lucence\\indexDir"; String dataDir = "d:\\Temp\\lucence\\dataDir"; Analyzer analyzer = new IKAnalyzer(true); // 使用中文分詞器 File dir = new File(dataDir); File[] files = dir.listFiles(); Directory fsDirectory = FSDirectory.open(new File(indexDir)); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer); config.setOpenMode(OpenMode.CREATE_OR_APPEND); config.setMaxBufferedDocs(1000); IndexWriter indexWriter = new IndexWriter(fsDirectory, config); for(int i = 0; i < files.length; i++) { String filePath = files[i].getAbsolutePath(); if(filePath.endsWith(".html") || filePath.endsWith(".htm")) { HTMLDocParser htmlParser = new HTMLDocParser(filePath); String path = htmlParser.getPath(); String title = htmlParser.getTitle(); Reader content = htmlParser.getContent(); Document document = new Document(); document.add(new Field("path", path, Field.Store.YES, Field.Index.NO, Field.TermVector.NO)); document.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.add(new Field("content", content, Field.TermVector.WITH_POSITIONS_OFFSETS)); indexWriter.addDocument(document); } } indexWriter.commit(); indexWriter.optimize(); indexWriter.close(); } |
3.2 搜尋文檔
在上面一部分中,我們已經為一個目錄下的文本文檔建立好了索引,現在在這個索引上進行搜尋以找到包含某個關鍵詞或短語的文檔。Lucene 提供了幾個基礎的類來完成這個過程,它們分别是呢 IndexSearcher, Query, QueryParser,TopDocs. 下面我們分别介紹這幾個類的功能。
Query
這是一個抽象類,Lucene針對不同的類型提供了不同的實作,比如 TermQuery, BooleanQuery, PrefixQuery,
PhraseQuery
等
. 這個類的目的是把使用者輸入的查詢字元串封裝成 Lucene 能夠識别的 Query。
QueryParser
如果不樂意去了解諸如BooleanQuery,PhraseQuery等看上去複雜的查詢類型。希望的是輸入一個字元串,它就能夠了解使用者的搜尋意圖,然後轉換成lucene中合理的Query子類,提供給lucene進行搜尋,那這個就是QueryParser。QueryParser能夠根據使用者的輸入來進行解析,自動建構合适的Query對象。
IndexSearcher
IndexSearcher 是用來在建立好的索引上進行搜尋的。它隻能以隻讀的方式打開一個索引,是以可以有多個 IndexSearcher的執行個體在一個索引上進行操作。
TopDocs
TopDocs是用來儲存搜尋的結果。儲存前N條得分高的記錄。
使用例子
public List search(String strQuery) throws Exception { List searchResult = new ArrayList(); String indexDir = "d:\\Temp\\lucence\\indexDir"; String field = "content"; Analyzer analyzer = new IKAnalyzer(true); // 使用中文分詞器 Directory fsDirectory = FSDirectory.open(new File(indexDir)); IndexSearcher indexSearcher = new IndexSearcher(fsDirectory, true); QueryParser queryParser = new QueryParser(Version.LUCENE_34, field, analyzer); Query query = queryParser.parse(strQuery); if (null != query && null != indexSearcher) { TopDocs hits = indexSearcher.search(query, 1000); int totalHits = hits.totalHits; int len = Math.min(1000, totalHits); ScoreDoc[] docs = hits.scoreDocs; for (int i = 0; i < len; i++) { SearchResultBean resultBean = new SearchResultBean(); Document doc = indexSearcher.doc(docs[i].doc); resultBean.setHtmlPath(doc.get("path")); resultBean.setHtmlTitle(doc.get("title")); searchResult.add(resultBean); } } return searchResult; } |
4. 附錄.
提供一個Lucene 工程。參考lucene-demo.rar。 點我下載下傳