Lucene5.x簡單示例教程
簡單例項:
package zmx.lucene.test; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopScoreDocCollector; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import java.io.IOException; public class LuceneTest { public static void main(String[] args) throws IOException, ParseException { Analyzer analyzer = new StandardAnalyzer(); //將索引儲存到記憶體中 Directory directory = new RAMDirectory(); //如下想把索引儲存到硬碟上,使用下面的程式碼代替 //Directory directory = FSDirectory.open(Paths.get("/tmp/testindex")); //寫入索引庫 IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter iwriter = new IndexWriter(directory, config); String[] texts = new String[]{ "Mybatis分頁外掛 - 示例", "Mybatis 貼吧問答 第一期", "Mybatis 示例之 複雜(complex)屬性(property)", "Mybatis極其(最)簡(好)單(用)的一個分頁外掛", "Mybatis 的Log4j日誌輸出問題 - 以及有關日誌的所有問題", "Mybatis 示例之 foreach (下)", "Mybatis 示例之 foreach (上)", "Mybatis 示例之 SelectKey", "Mybatis 示例之 Association (2)", "Mybatis 示例之 Association" }; for (String text : texts) { Document doc = new Document(); // doc.add(new Field("fieldname", text, TextField.TYPE_STORED)); doc.add(new TextField("title", text, Field.Store.YES)); doc.add(new StringField("isbn", ""+String.valueOf(Math.random()), Field.Store.YES)); iwriter.addDocument(doc); } iwriter.close(); //讀取索引並查詢 DirectoryReader reader = DirectoryReader.open(directory); IndexSearcher isearcher = new IndexSearcher(reader); //解析一個簡單的查詢 QueryParser parser = new QueryParser("title", analyzer); Query query = parser.parse("foreach"); ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs; //迭代輸出結果 for (int i = 0; i < hits.length; i++) { Document hitDoc = isearcher.doc(hits[i].doc); System.out.println(hitDoc.get("title")); System.out.println(hitDoc.get("isbn")); } reader.close(); directory.close(); } }
執行結果:
Mybatis 示例之 foreach (下)
0.8654220005188332
Mybatis 示例之 foreach (上)
0.4180114705503467
Lucene API :
org.apache.lucene.analysis
定義了從Reader
轉換為TokenStream
的抽象Analyzer
API,主要就是分詞器。提供了一些預設的實現,包含StopAnalyzer
和基於文法的StandardAnalyzer
。中文分詞可以參考中文分詞庫 IKAnalyzer。
org.apache.lucene.codecs
提供了一個抽象的編碼和解碼的倒排索引結構,還提供了一些不同的實現可以應用於不同的程式需求。
org.apache.lucene.document
提供了一個簡單的Document
類。一個文件只是一組命名的欄位,它的值可以是字串或者Reader
的例項。
org.apache.lucene.index
提供了兩個主要的類:IndexWriter
用於建立和給文件新增索引,IndexReader
用於訪問索引資料。
org.apache.lucene.search
提供代表查詢的資料結構(例如TermQuery
用於單獨的關鍵字查詢,PhraseQuery
用於短句,BooleanQuery
用於布林聯合查詢)。IndexSearcher
將查詢轉換為TopDocs
。一些QueryParsers
提供了從字串或者xml生成查詢結構的功能。
org.apache.lucene.store
定義了一個抽象類來儲存持久化資料,Directory
這是一個由IndexOutput
和IndexInput
分別寫和讀取的指定檔案的集合。提供了多個實現,包括FSDirectory
,這個實現使用檔案系統目錄來儲存檔案。還有RAMDirectory
類實現了檔案駐留在記憶體中的資料結構。
org.apache.lucene.util
包含了一些有用的資料結構和工具類,例如FixedBitSet
和PriorityQueue
。
Luncene使用步驟:
-
通過新增欄位(
Field
)建立文件(Document
); -
建立
IndexWriter
,通過addDocument()
方法新增文件(Document
); -
呼叫
QueryParser.parser()
方法從字串生成查詢物件; -
建立
IndexSearcher
並通過search()
方法進行查詢。