簡介:java
Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文檢索引擎程序員
發展:apache
Lucene最初是由Doug Cutting開發的,在SourceForge的網站上提供下載。在2001年9月作爲高質量的開源Java產品加入到Apache軟件基金會的 Jakarta家族中。隨着每一個版本的發佈,這個項目獲得 編程
明顯的加強,也吸引了更多的用戶和開發人員。2004年7月,Lucen 架構
e1.4版正式發佈,10月的1.4.2版本作了一次bug修正。表1.1顯示了Lucene的發佈歷史。 工具
版本 發佈日期 里程碑 性能
0.01 2000年3月 第一個開源版本(SourceForge) 學習
1.0 2000年10月
1.01b 2001年7月 最後的SourceForge版本
1.2 2002年6月 第一個Apache Jakarta版本
1.3 2003年12月 複合索引格式,查詢分析器增長,遠程搜索,token定位,可擴展的API
1.4 2004年7月 Sorting, span queries, term vectors
1.4.1 2004年8月 排序性能的bug修正
1.4.2 2004年10月 IndexSearcher optimization and misc. fixes
1.4.3 2004年冬 Misc. fixes2.4.1 2009年3月8日發佈新版本
2.3.0 2008年1月 更新爲2.3.0
2.4.0 2008年10月 更新爲2.4.0
2.4.1 2009年 5月 更新爲 2.4.1
2.9.0 2009年9月25號 更新爲2.9.0
2.9.1 2009年11月6號 更新爲2.9.1
3.0.0 2009年11月25號 更新爲3.0.0
3.0.1 2010年2月26號 更新爲3.0.1
3.0.2 2010年6月18號 更新爲3.0.2
3.0.3 2010年12月3號 更新爲3.0.3
提點優點:
做爲一個開放源代碼項目,Lucene從問世以後,引起了開放源代碼社羣的巨大反響,程序員們不只使用它構建具體的全文檢索應用,並且將之集成到各類系統軟件中去,以及構建Web應用,甚至某些商業軟件也採用了Lucene做爲其內部全文檢索子系統的核心。apache軟件基金會的網站使用了Lucene做爲全文檢索的引擎,IBM的開源軟件eclipse[9]的2.1版本中也採用了Lucene做爲幫助子系統的全文索引引擎,相應的IBM的商業軟件Web Sphere[10]中也採用了Lucene。Lucene以其開放源代碼的特性、優異的索引結構、良好的系統架構得到了愈來愈多的應用。
Lucene是一個高性能、可伸縮的信息搜索(IR)庫。它使你能夠爲你的應用程序添加索引和搜索能力。Lucene是用java實現的成熟的、免費的開源項目,是著名的Apache Jakarta你們庭的一員,而且基於在Apache軟件許可 [ASF, License]。一樣,Lucene是當前與近幾年內很是流行的免費的Java信息搜索(IR)庫。
Lucene做爲一個全文檢索引擎,其具備以下突出的優勢:
(1)索引文件格式獨立於應用平臺。Lucene定義了一套以8位字節爲基礎的索引文件格式,使得兼容系統或者不一樣平臺的應用可以共享創建的索引文件。
(2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,可以針對新的文件創建小文件索引,提高索引速度。而後經過與原有索引的合併,達到優化的目的。
(3)優秀的面向對象的系統架構,使得對於Lucene擴展的學習難度下降,方便擴充新功能。
(4)設計了獨立於語言和文件格式的文本分析接口,索引器經過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只須要實現文本分析的接口。
(5)已經默認實現了一套強大的查詢引擎,用戶無需本身編寫代碼即便系統可得到強大的查詢能力,Lucene的查詢實現中默認實現了布爾操做、模糊查詢(Fuzzy Search[11])、分組查詢等等。
面對已經存在的商業全文檢索引擎,Lucene也具備至關的優點。
首先,它的開發源代碼發行方式(遵照Apache Software License[12]),在此基礎上程序員不只僅能夠充分的利用Lucene所提供的強大功能,並且能夠深刻細緻的學習到全文檢索引擎製做技術和麪相對象編程的實踐,進而在此基礎上根據應用的實際狀況編寫出更好的更適合當前應用的全文檢索引擎。在這一點上,商業軟件的靈活性遠遠不及Lucene。
其次,Lucene秉承了開放源代碼一向的架構優良的優點,設計了一個合理而極具擴充能力的面向對象架構,程序員能夠在Lucene的基礎上擴充各類功能,好比擴充中文處理能力,從文本擴充到HTML、PDF[13]等等文本格式的處理,編寫這些擴展的功能不只僅不復雜,並且因爲Lucene恰當合理的對系統設備作了程序上的抽象,擴展的功能也能輕易的達到跨平臺的能力。
最後,轉移到apache軟件基金會後,藉助於apache軟件基金會的網絡平臺,程序員能夠方便的和開發者、其它程序員交流,促成資源的共享,甚至直接得到已經編寫完備的擴充功能。最後,雖然Lucene使用Java語言寫成,可是開放源代碼社區的程序員正在不懈的將之使用各類傳統語言實現(例如.net framework[14]),在遵照Lucene索引文件格式的基礎上,使得Lucene可以運行在各類各樣的平臺上,系統管理員能夠根據當前的平臺適合的語言來合理的選擇。
如何用java實現lucene(只使用,不求甚解版-_-")
lucene有7個包須要導入:analysis,document,index,queryParser,search,store,util
IndexWriter writer = new IndexWriter("E:/index", new StandardAnalyze(),true,MaxFieldLength.UNLIMITED); //true表明覆蓋原先數據,maxFieldLength用來限制Field的大小
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("time", "60", Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.addDocument(doc);
writer.optimize(); //優化
writer.close();
IndexSearcher searcher= new IndexSearcher("E:/index") Query query = new TermQuery(new Term("title", "lucene"));//單個字節查詢
//Query query = new FuzzyQuery(new Term("title", "lucena"));//模糊查詢
//Query query = new WildcardQuery(new Term("title", "lu*"));// 通配符查詢 ?表明一個字符,*表明0到多個字符
//BooleanQuery query = new BooleanQuery();//條件查詢
//BooleanQuery qson1 = new BooleanQuery();
//Query q1 = new TermQuery(new Term("title", "lucene"));
//qson1.add(q1, Occur.MUST);//MUST是必須知足的
//BooleanQuery qson2 = new BooleanQuery();
//Query q2= new TermQuery(new Term("sex", "woman"));
//qson2 .add(qson1, Occur.MUST_NOT);//MUST_NOT是必須不知足
//query.add(qson1, Occur.SHOULD);
//query.add(qson2, Occur.SHOULD);//SHOULD表明知足qson1或者知足qson2均可以
//PhraseQuery query = new PhraseQuery();//近距離查詢
//query.setSlop(5);//距離設置爲5
//query.add(new Term("title", "lucene"));
//query.add(new Term("title", "introduction"));//查詢出title中lucene和introduction距離不超過5個字符的結果
//Query query = new PrefixQuery(new Term("title", "lu"));//WildcardQuery的lu*同樣
//RangeQuery query = new RangeQuery(new Term("time", "50"),new Term("time", "60"), true);
//true表明[50,60],false表明(50,60)
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
Document d = hits.doc(i);
String title= d.get("title");
System.out.print(title+ " ");
}
這樣,基本上就可使用了
注:以上代碼爲lucene早些版本的寫法。lucene3.02的寫法有所改變。