Lucene原始碼解析--搜尋過程<二>
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);
}
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Feign原始碼解析:初始化過程(二)原始碼
- 網站搜尋功能lucene網站
- 【elasticsearch】搜尋過程詳解Elasticsearch
- 以太坊啟動過程原始碼解析原始碼
- android apk安裝過程原始碼解析AndroidAPK原始碼
- Dubbo服務呼叫過程原始碼解析④原始碼
- 從Chrome原始碼看DNS解析過程Chrome原始碼DNS
- SpringMVC原始碼解析(1)-啟動過程SpringMVC原始碼
- 開源搜尋技術的核心引擎 —— Lucene
- 【Elasticsearch學習】文件搜尋全過程Elasticsearch
- Feign原始碼解析:初始化過程(一)原始碼
- Spark 原始碼系列(六)Shuffle 的過程解析Spark原始碼
- Dubbo原始碼解析之服務引入過程原始碼
- Dubbo原始碼解析之服務呼叫過程原始碼
- Android原始碼完全解析——View的Measure過程Android原始碼View
- 看 Lumen 原始碼解析 Request 到 Response 過程原始碼
- Universal-Image-Loader原始碼解解析---display過程 + 獲取bitmap過程原始碼
- vue2.x原始碼解析系列二: Vue元件初始化過程概要Vue原始碼元件
- Netty原始碼解析 -- 服務端啟動過程Netty原始碼服務端
- Netty原始碼解析 -- ChannelOutboundBuffer實現與Flush過程Netty原始碼
- vue原始碼解析-圖解diff詳細過程Vue原始碼圖解
- Spring Bean 的例項化過程原始碼解析SpringBean原始碼
- Dubbo原始碼解析之服務匯出過程原始碼
- 二分搜尋樹系列之[特性及完整原始碼-code]原始碼
- 二分搜尋樹系列之「特性及完整原始碼-code」原始碼
- python 寫的搜尋引擎 - 原始碼Python原始碼
- Fabric1.4原始碼解析:鏈碼例項化過程原始碼
- RxJava原始碼解析(二)—執行緒排程器SchedulerRxJava原始碼執行緒
- 從原始碼角度解析 Springboot 2.6.2 的啟動過程原始碼Spring Boot
- Netty原始碼解析 -- ChannelPipeline機制與讀寫過程Netty原始碼
- Android View 原始碼解析(三) – View的繪製過程AndroidView原始碼
- ThreadPoolExecutor原始碼解析(二)thread原始碼
- Tantivy與Quickwit:類似Lucene的Rust全文搜尋引擎庫UIRust
- 談談對搜尋技術Elastic Search&Lucene的理解AST
- 直播app原始碼,預設顯示搜尋框 保留搜尋條件APP原始碼
- 從二分搜尋到二叉搜尋樹
- 詳細說明搜尋引擎優化的過程優化
- TiCDC 原始碼閱讀(三)TiCDC 叢集工作過程解析原始碼
- 原始碼解析.Net中Host主機的構建過程原始碼