Lucene原始碼解析--搜尋過程<二>

百聯達發表於2013-08-13
Lucene搜尋樣例:
public static void main(String[] args)
{
 try {
     IndexReader reader=DirectoryReader.open(FSDirectory.open(new File("F:\\index")));
     IndexSearcher searcher=new IndexSearcher(reader);
     Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);
     
      QueryParser queryParser=new QueryParser(Version.LUCENE_43, "content", analyzer);
     
      Query query=queryParser.parse("lucene");
      TopDocs topDocs=searcher.search(query, 10);
     
      ScoreDoc[] hits=topDocs.scoreDocs;
     
      for(int i=0;i      {
          System.out.println("score:"+hits[i].score);
          System.out.println("title:"+searcher.doc((hits[i].doc)).get("title"));
      }
     
     // reader.close();
   
} catch (Exception e) {
    e.printStackTrace();
}   
}

下面我們來分析紅色標註的部分.

IndexSearcher:

在一個單獨的IndexReader上實現查詢。 應用通常呼叫search(Query,int)或search(Query,Filter,int)
進行檢索。 為了效能的考慮,如果你的索引是不變的,你應該為所有的查詢應用一個單例項的IndexSearcher
而非每個查詢建立一個例項。  如果你的索引已經改變,並且你希望檢索時看到這些變化,你應該呼叫DirectoryReader的
openIfChanged(DirectoryReader)方法去重新獲取reader,然後在該reader上建立一個新的IndexSearcher。


final IndexReader reader;
protected final IndexReaderContext readerContext;
protected final List leafContexts;
protected final LeafSlice[] leafSlices;
private final ExecutorService executor;
private static final Similarity defaultSimilarity = new DefaultSimilarity();

IndexSearcher 表面上看起來好像僅僅是reader 的一個封裝,它的很多函式都是直接呼叫reader 的相應函式,如:int docFreq(Term term),Document doc(int i),int maxDoc()。

然而它提供了兩個非常重要的函式:

1. void setSimilarity(Similarity similarity),使用者可以實現自己的Similarity 物件,從而影響搜尋過程的打分

2. 一系列search 函式,是搜尋過程的關鍵,主要負責打分的計算和倒排表的合併。
因而在某些應用之中,只想得到某個詞的倒排表的時候,最好不要用IndexSearcher,而直接
用IndexReader.termDocs(Term term),則省去了打分的計算。


IndexSeacher建構函式:

 public IndexSearcher(IndexReaderContext context, ExecutorService executor) {
    assert context.isTopLevel: "IndexSearcher's ReaderContext must be topLevel for reader" + context.reader();
    reader = context.reader();
    this.executor = executor;
    this.readerContext = context;
    leafContexts = context.leaves();
    this.leafSlices = executor == null ? null : slices(leafContexts);
  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-768385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章