lucene4.7收集器Collector怎么自定義

本篇內(nèi)容介紹了“l(fā)ucene4.7收集器Collector怎么自定義”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蒙城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式蒙城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蒙城地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

lucene4.7收集器Collector怎么自定義

我們先來回顧下,一個(gè)基本的搜索流程是怎么完成的 
1,得到一個(gè)索引目錄Directory(可能基于內(nèi)存的或者磁盤的)。 
2,得到一個(gè)DirectoryReader。 
3,實(shí)例化查詢組件IndexSearcher。 
4,檢索得到TopDoc查詢結(jié)果集 
5,遍歷ScoresDocs處理結(jié)果 

我們看下這個(gè)檢索的流程,大概可以分這5步,前1,2,3算是準(zhǔn)備工作,后面的2步是我們經(jīng)常需要進(jìn)行數(shù)據(jù)處理的地方,那么我們Collector到底工作在哪一步呢?,其實(shí)Collector真正的起作用是在3-4步之間的。 

那么Collector的作用是干什么的?為什么需要使用Collector? 

在這之前先分析下TopDocs這個(gè)類,這個(gè)類的工作原理,其實(shí)在后臺使用的也是一個(gè)收集器,收收集我們檢索的結(jié)果,通過TopDocsCollector這個(gè)基類下面的2個(gè)子類收集器,來收集一次我們檢索的命中數(shù)據(jù)。 
所以collector的作用就是收集某些我們需要定制化的結(jié)果集,某些情況下使用collector可以可以極大的提升我們程序的性能,通過collector可以讓我們對每一個(gè)匹配上的文檔做一些特有的定制化操作,當(dāng)然前提是在我們需要使用的情況下。 
下面我們來看下collector基類的幾個(gè)方法

方法說明
collect()檢索時(shí),每匹配上一個(gè)文檔,都會調(diào)用此方法
acceptsDocsOutOfOrder()測試本collector是否能處理無序到達(dá)的docid
setScorer(Scorer scorer)處理檢索結(jié)果的評分
setNextReader(AtomicReaderContext context)檢索時(shí),在多個(gè)索引段結(jié)構(gòu)之間切換的方法

下面我們來看下自定義的一個(gè)collector來實(shí)現(xiàn)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
 * 
 * 自定義收集器
 * 實(shí)現(xiàn)評分收集
 * **/
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;//全局相對段基數(shù)
     

    @Override
    public boolean acceptsDocsOutOfOrder() {
        // TODO Auto-generated method stub
        //返回true是允許無次序的ID
        //返回false必須是有次序的
        return true;
    }

    @Override
    public void collect(int arg0) throws IOException {
        /**
         * 匹配上一個(gè)文檔
         * 就記錄其docid與打分情況
         * 
         * */
        docs.add(new ScoreDoc(arg0+docBase,scorer.score()));//
    }
//    BinaryDocValues names;//字符類型的內(nèi)置存儲
//    BinaryDocValues bookNames;//字符類型的內(nèi)置存儲
//    BinaryDocValues ids;//字符類型的內(nèi)置存儲
//    BinaryDocValues prices;//字符類型的內(nèi)置存儲
//    FieldCache.Doubles d ; //數(shù)值類型的內(nèi)置存儲
//    FieldCache.Ints ints;//數(shù)值類型的內(nèi)置存儲
    @Override
    public void setNextReader(AtomicReaderContext arg0) throws IOException {
        this.docBase=arg0.docBase;//記錄每個(gè)索引段結(jié)構(gòu)的相對位置
    }

    @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);
          /**
           * 自定義的收集類,實(shí)現(xiàn)效果===>ScoreDocs類
           * 
           **/
          List<ScoreDoc> s=scoreCollector.docs;
          for(ScoreDoc sc:s){
              System.out.println(sc.doc+"===="+sc.score);
          }

輸出結(jié)果如下

0====1.0
1====1.0
2====1.0
3====1.0
4====1.0
5====1.0
6====1.0
7====1.0

“l(fā)ucene4.7收集器Collector怎么自定義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

本文題目:lucene4.7收集器Collector怎么自定義
本文來源:http://bm7419.com/article46/jcseeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)移動網(wǎng)站建設(shè)、建站公司、App設(shè)計(jì)外貿(mào)建站、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司