Collector的使用和MultiReader的使用

Lucene版本用的是3.5.0,虽然版本比较老,但是Zoie支持这个版本。


package w0141112;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultiReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;

import java.io.*;

/**
 * User: zhijun.he@renren-inc.com
 * Date: 2014/11/12.
 */
public class LuceneTask {
    public static void main(String[] args) {
        BufferedReader input = null;
        FSDirectory dir = null;
        IndexSearcher searcher = null;
        String[] path = {"/data/dmp_index/dmp_index_v1_0", "/data/dmp_index/dmp_index_v1_1"};

        try {
            MultiReader reader = new MultiReader(new IndexReader[]{
                    IndexReader.open(FSDirectory.open(new File(path[0]))),
                    IndexReader.open(FSDirectory.open(new File(path[1])))});
            /*dir = FSDirectory.open(new File("/data/dmp_index/dmp_index_v1_0"));
            IndexReader reader = IndexReader.open(dir);*/
            System.out.println("begin");
            System.out.println(reader.numDocs());
            /*TermEnum te = reader.terms(new Term("v", "stro04"));
            int cnt = 0;
            while (te.next()) {
                Term term = te.term();
                if (term.field().equals("v")) {
                    System.out.println(term.text());
                    if (++cnt == 200) {
                        break;
                    }
                }
            }*/
            searcher = new IndexSearcher(reader);
           // Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

            InputStream inputStream = new FileInputStream("input.txt");
            input = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
            String tag;
            while ((tag = input.readLine()) != null) {
                System.out.print(tag + " ");
                TermQuery query = new TermQuery(new Term("v", tag));
                MyCollector collector = new MyCollector();
                searcher.search(query, collector);
                System.out.println(collector.cnt);
            }
            System.out.println("over");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (searcher != null) {
                    searcher.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

class MyCollector extends Collector {
    int cnt = 0;

    public MyCollector() {
        super();
    }

    @Override
    public void setScorer(Scorer scorer) throws IOException {

    }

    @Override
    public void collect(int i) throws IOException {
        cnt++;
    }

    @Override
    public void setNextReader(IndexReader indexReader, int i) throws IOException {
    }

    @Override
    public boolean acceptsDocsOutOfOrder() {
        return false;
    }
}

这里只是统计了tag这两个索引文件中的数量。说明以下几点收获:

1.对于向两个索引文件一起查找,网上查询的结果是使用ParallelMultiSearcher或者MultiSearcher,但是这两个方法即使在lucene 3.5.0版本都已经deprecated了,所以使用了

MultiReader

2.collector的使用

可以看到这里collector其实根本没有加什么代码,就实现了统计的功能。需要指出的是collect方法是对于每一个匹配query的doc都会进入这个方法,目测i就是匹配的doc的id号了。那我为什么不适用search(query, int)那个方法呢?(我突然发现,用search(query,int)方法更合适,原先理解错了,就是无论int设置多少小,totalHits都会返回所有值...)但是需要指出的是这个int值绝对不能设置太大,因为它会开辟一个相同大小的队列,太大就会使java运行时报错,比如设置为Integer.MaxValue, 会报out of heap)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值