1. 程式人生 > >Lucene5.x簡單示例教程

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的抽象AnalyzerAPI,主要就是分詞器。提供了一些預設的實現,包含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這是一個由IndexOutputIndexInput分別寫和讀取的指定檔案的集合。提供了多個實現,包括FSDirectory,這個實現使用檔案系統目錄來儲存檔案。還有RAMDirectory類實現了檔案駐留在記憶體中的資料結構。

org.apache.lucene.util

包含了一些有用的資料結構和工具類,例如FixedBitSetPriorityQueue

Luncene使用步驟:

  1. 通過新增欄位(Field)建立文件(Document);

  2. 建立IndexWriter,通過addDocument()方法新增文件(Document);

  3. 呼叫QueryParser.parser()方法從字串生成查詢物件;

  4. 建立IndexSearcher並通過search()方法進行查詢。