lucene4.7 收集器Collector(七)



lucene4.7 收集器Collector(七)
我们先来回顾下,一个基本的搜索流程是怎么完成的 
1,得到一个索引目录Directory(可能基于内存的或者磁盘的)。 
2,得到一个DirectoryReader。 
3,实例化查询组件IndexSearcher。 
4,检索得到TopDoc查询结果集 
5,遍历ScoresDocs处理结果 

我们看下这个检索的流程,大概可以分这5步,前1,2,3算是准备工作,后面的2步是我们经常需要进行数据处理的地方,那么我们Collector到底工作在哪一步呢?,其实Collector真正的起作用是在3-4步之间的。 
我们看下这个检索的流程,大概可以分这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)检索时,在多个索引段结构之间切换的方法
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);
          }
Please read full article from lucene4.7 收集器Collector(七)


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts