您好,登錄后才能下訂單哦!
本篇內容介紹了“lucene4.7收集器Collector怎么自定義”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我們先來回顧下,一個基本的搜索流程是怎么完成的
1,得到一個索引目錄Directory(可能基于內存的或者磁盤的)。
2,得到一個DirectoryReader。
3,實例化查詢組件IndexSearcher。
4,檢索得到TopDoc查詢結果集
5,遍歷ScoresDocs處理結果
我們看下這個檢索的流程,大概可以分這5步,前1,2,3算是準備工作,后面的2步是我們經常需要進行數據處理的地方,那么我們Collector到底工作在哪一步呢?,其實Collector真正的起作用是在3-4步之間的。
那么Collector的作用是干什么的?為什么需要使用Collector?
在這之前先分析下TopDocs這個類,這個類的工作原理,其實在后臺使用的也是一個收集器,收收集我們檢索的結果,通過TopDocsCollector這個基類下面的2個子類收集器,來收集一次我們檢索的命中數據。
所以collector的作用就是收集某些我們需要定制化的結果集,某些情況下使用collector可以可以極大的提升我們程序的性能,通過collector可以讓我們對每一個匹配上的文檔做一些特有的定制化操作,當然前提是在我們需要使用的情況下。
下面我們來看下collector基類的幾個方法
方法 | 說明 |
collect() | 檢索時,每匹配上一個文檔,都會調用此方法 |
acceptsDocsOutOfOrder() | 測試本collector是否能處理無序到達的docid |
setScorer(Scorer scorer) | 處理檢索結果的評分 |
setNextReader(AtomicReaderContext context) | 檢索時,在多個索引段結構之間切換的方法 |
下面我們來看下自定義的一個collector來實現ScoreDoc類的功能,代碼如下.
package com.piaoxuexianjing; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.search.Collector; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Scorer; /** * @author * @version 1.0 * * 自定義收集器 * 實現評分收集 * **/ public class MyScoreCollector extends Collector { //private HashMap<String, String> documents=new HashMap<String, String>(); List<ScoreDoc> docs=new ArrayList<ScoreDoc>(); private Scorer scorer;//scorer類 private int docBase;//全局相對段基數 @Override public boolean acceptsDocsOutOfOrder() { // TODO Auto-generated method stub //返回true是允許無次序的ID //返回false必須是有次序的 return true; } @Override public void collect(int arg0) throws IOException { /** * 匹配上一個文檔 * 就記錄其docid與打分情況 * * */ docs.add(new ScoreDoc(arg0+docBase,scorer.score()));// } // BinaryDocValues names;//字符類型的內置存儲 // BinaryDocValues bookNames;//字符類型的內置存儲 // BinaryDocValues ids;//字符類型的內置存儲 // BinaryDocValues prices;//字符類型的內置存儲 // FieldCache.Doubles d ; //數值類型的內置存儲 // FieldCache.Ints ints;//數值類型的內置存儲 @Override public void setNextReader(AtomicReaderContext arg0) throws IOException { this.docBase=arg0.docBase;//記錄每個索引段結構的相對位置 } @Override public void setScorer(Scorer arg0) throws IOException { // TODO Auto-generated method stub this.scorer=arg0;//記錄改匹配的打分情況 } }
測試類的核心代碼
//自定義收集器 MyScoreCollector scoreCollector=new MyScoreCollector(); searcher.search(new MatchAllDocsQuery(), scoreCollector); /** * 自定義的收集類,實現效果===>ScoreDocs類 * **/ List<ScoreDoc> s=scoreCollector.docs; for(ScoreDoc sc:s){ System.out.println(sc.doc+"===="+sc.score); }
輸出結果如下
0====1.0 1====1.0 2====1.0 3====1.0 4====1.0 5====1.0 6====1.0 7====1.0
“lucene4.7收集器Collector怎么自定義”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。