http://www.zzbaike.com/wiki/Lucene%E5%85%A5%E9%97%A8%E4%BD%BF%E7%94%A8
http://blog.csdn.net/mxz391/archive/2007/05/15/1610140.aspx
Lucene入門使用
【AD】:最快的美國主機,不限空間,不限流量! | 註冊網域名稱到世界最大的註冊商Godaddy,中文.com網域名稱50元!
出自站長百科跳轉到: 導航, 搜尋
| 目錄
[隱藏]
- 1 Lucene的下載和配置
- 2 Lucene 的範例(Demo )
- 3 利用Lucene進行索引
- 4 利用Lucene進行檢索
- 5 Lucene的其他使用
- 6 總結
- 7 參考來源
|
Lucene的下載和配置
1、Lucene的下載
lucene在jakarta項目中的發布首頁:http://jakarta.apache.org/lucene/docs/index.html。
2、lucene的配置 首先請確定你的機子已經進行了Java使用環境的基本配置,即確保在某個平台下能夠運行java原始碼,否則請查閱相關文檔進行配置。
接下來進入lucene的配置:
普通使用者:在環境變數的CLASSPATH中添加lucene的位置。比如:“D:\java \lucene-1.4-final\lucene-1.4-final.jar;”。
Jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”進行添加。
Jsp使用者:也可以直接將lucene-1.4-final.jar檔案放到\WEB-INF\classes下。
Lucene 的範例(Demo )
1、Demo說明
可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4-final中包括對普通檔案和html檔案的兩種索引,XMLIndexingDemo針對xml檔案的索引。他們的區別主要在於:對普通檔案進行索引時只要對檔案的全文進行索引,而針對html、xml檔案時,對標籤類型不能進行索引,在實現上:html、xml的索引需要額外的資料流分析器,以分析哪些內容有用哪些無用。因此,在後兩者實現上,索引的時間額外開支,甚至超過索引本身時間,而檢索時間沒有區別。
以上Demo中,lucene-demos-1.4-final內建於lucene-1.4-final.zip中,XMLIndexingDemo的: http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/
2、Demo的運行
首先將demo.jar的路徑添加如環境變數的CLASSPATH中,例如:“D:\java\lucene-1.4-final\lucene-demos-1.4-final.jar;”,同時確保已經添加lucene-1.4-final.jar。
然後進行檔案的全文索引,在dos控制台中,輸入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,後面的路徑為所要進行索引的檔案夾,例如:“java org.apache.lucene.demo.IndexFiles c:\test”。
接著對索引進行檢索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”後輸入檢索詞,程式將進行檢索列出檢索得到的結果(檢索詞出現的檔案路徑)。其他Demo的運行請參考\docs\demo.html。
在運行Demo後請閱讀Demo的原始碼以便深入學習。
利用Lucene進行索引
進行lucene的熟悉後,我們將學習如何使用Lucene。
一段索引的應用執行個體:
//需要捕捉IOException異常 //建立一個IndexWriter,索引儲存目錄為“index” String[] stopStrs = { "他奶奶的", "fuck"}; StandardAnalyzer analyzer = new StandardAnalyzer(stopStrs); IndexWriter writer = new IndexWriter("index", analyzer, true); //添加一條文檔 Document doc = new Document(); doc.add(Field.UnIndexed("id", "1"));//“id”為欄位名,“1”為欄位值 doc.add(Field.Text("text", "fuck,他奶奶的,入門與使用")); writer.addDocument(doc); //索引完成後的處理 writer.optimize(); writer.close();
看完這段執行個體後,我們開始熟悉lucene的使用:
1、Lucene的索引介面
在學習索引的時候,首先需要熟悉幾個介面:
分析器主要工作是篩選,一段文檔進來以後,經過它,出去的時候只剩下那些有用的部分,其他則剔除。而這個分析器也可以自己根據需要而編寫。
org.apache.lucene.analysis.Analyzer:這是一個虛構類,以下兩個借口均繼承它而來。
org.apache.lucene.analysis.SimpleAnalyzer:分析器,支援最簡單拉丁語言。
org.apache.lucene.analysis.standard.StandardAnalyzer:標準分析器,除了拉丁語言還支援亞洲語言,並在一些匹配功能上進行完善。在這個介面中還有一個很重要的建構函式:
StandardAnalyzer(String[] stopWords),可以對分析器定義一些使用詞語,這不僅可以免除檢索一些無用資訊,而且還可以在檢索中定義禁止的政治性、非法性的檢索關鍵詞。
IndexWriter的建構函式有三種介面,針對目錄Directory、檔案File、檔案路徑String三種情況。
例如IndexWriter(String path, Analyzer a, boolean create),path為檔案路徑,a為分析器,create標誌是否重建索引(true:建立或者覆蓋已存在的索引,false:擴充已存在的索引。)
I ndexWriter為了減少大量的io維護操作,在每得到一定量的索引後建立新的小索引檔案(筆者測試索引批量的最小單位為10),然後再定期將它們整合到一個索引檔案中,因此在索引結束時必須進行wirter. optimize(),以便將所有索引合并最佳化。
- 1.3 org.apache.lucene.document
以下介紹兩種主要的類:
a)org.apache.lucene.document.Document:
Document文檔類似資料庫中的一條記錄,可以由好幾個欄位(Field)組成,並且欄位可以套用不同的類型(詳細見b)。Document的幾種介面:
b)org.apache.lucene.document.Field
即上文所說的“欄位”,它是Document的片段section。
Field的建構函式: Field(String name, String string, boolean store, boolean index, boolean token)。
Indexed:如果欄位是Indexed的,表示這個欄位是可檢索的。
Stored:如果欄位是Stored的,表示這個欄位的值可以從檢索結果中得到。
Tokenized:如果一個欄位是Tokenized的,表示它是有經過Analyzer轉變後成為一個tokens序列,在這個轉變過程tokenization中,Analyzer提取出需要進行索引的文本,而剔除一些冗餘的詞句(例如:a,the,they等,詳見org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。
Token是索引時候的基本單元,代表一個被索引的詞,例如一個英文單詞,或者一個漢字。因此,所有包含中文的文本都必須是Tokenized的。
Field的幾種介面:
利用Lucene進行檢索
1、 一段簡單的檢索代碼
//需要捕捉IOException,ParseException異常 //處理檢索條件 Query query = QueryParser.parse("入門", "text", analyzer); //檢索 Searcher searcher = new IndexSearcher("./index");//"index"指定索引檔案位置 Hits hits = searcher.search(query); //列印結果值集 for (int i = 0; i < hits.length(); i++) { Document doc = hits.doc(i); String id = doc.get("id"); System.out.println("found " + "入門" + " on the id:" + id); }
2、利用Lucene的檢索介面
主要使用方法:
QueryParser .parse(String query, String field, Analyzer analyzer),例如:
Query query = QueryParser.parse("入門", "text", analyzer);
"入門"為檢索詞, "text"為檢索的欄位名, analyzer為分析器
Hits的主要使用介面:
Lucene的其他使用
1、Lucene 的索引修改
下面給出一段修改索引的代碼,請根據Lucene的API解讀:
/** * 對已有的索引添加新的一條索引 * @param idStr String:要修改的id * @param doc Document:要修改的值 */ public void addIndex(String idStr, String valueStr) { StandardAnalyzer analyzer = new StandardAnalyzer(); IndexWriter writer = null; try { writer = new IndexWriter(indexPath, analyzer, false); writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否則不能正確反映修改 Document doc = new Document(); doc.add(Field.UnIndexed("id", idStr));//“id”為欄位名,“1”為欄位值 doc.add(Field.Text("text", valueStr)); writer.addDocument(doc); writer.optimize(); writer.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 刪除索引 * * @param idStr String */ public void deleteIndex(String idStr) { try { Directory dirt = FSDirectory.getDirectory(indexPath, false); IndexReader reader = IndexReader.open(dirt); Term term = new Term("text", idStr); reader.delete(term); reader.close(); dirt.close(); } catch (IOException ioe) { ioe.printStackTrace(); } }
2、Lucene 的檢索結果排序
Lucene的排序主要是對org.apache.lucene.search.Sort的使用。Sort可以直接根據欄位Field產生,也可以根據標準的SortField產生,但是作為Sort的欄位,必須符合以下的條件:唯一值以及Indexed。可以對Integers, Floats, Strings三種類型排序。
對整數型的ID檢索結果排序只要進行以下的簡單操作:
Sort sort = new Sort("id"); Hits hits = searcher.search(query, sort);
使用者還可以根據自己定義更加複雜的排序,詳細請參考API。
總結
Lucene給java的全文索引檢索帶來了非常強大的力量,以上僅對Lucene進行簡單的入門說明