lucene5.1 fst源码分析(BooleanQuery分析)

.1 测试代码

.1-1 写入代码

public static void writeIndex() throws IOException{

      Directory directory = FSDirectory.open(Paths.get("/Users/waixingren/bigdata-java/mysolr52test/lucenecountdata"));
      Analyzer analyzer = new StandardAnalyzer();
      IndexWriterConfig config = new IndexWriterConfig(analyzer);
      config.setUseCompoundFile(false);
      IndexWriter indexWriter = new IndexWriter(directory, config);

      Document doc1 = newDoc("1", "cubeli", "one of tencent employee");
      Document doc2 = newDoc("2", "liyong", "one of tencent employee");
      Document doc3 = newDoc("3", "yangziying", "one of tencent employee");
      Document doc4 = newDoc("4", "litairan", "one of tencent employee");
      Document doc5 = newDoc("5", "zhanshan", "one of tencent employee");
      Document doc6 = newDoc("6", "cubeli", "one of tencent employee");
      Document doc7 = newDoc("7", "lisi", "one of tencent employee");
      Document doc8 = newDoc("8", "wangwu", "cubeli, one of tencent employee");
      Document doc9 = newDoc("9", "xiaomi", "one of tencent employee");
      Document doc10 = newDoc("10", "taotao,yes he is cubeli son", "one of tencent employee");
      Document doc11 = newDoc("11", "cubeli, cubeli", "cubeli is one of tencent employee, yes cubeli");

      indexWriter.addDocument(doc1);
      indexWriter.addDocument(doc2);
      indexWriter.addDocument(doc3);
      indexWriter.addDocument(doc4);
      indexWriter.addDocument(doc5);
      indexWriter.addDocument(doc6);
      indexWriter.addDocument(doc7);
      indexWriter.addDocument(doc8);
      indexWriter.addDocument(doc9);
      indexWriter.addDocument(doc10);
      indexWriter.addDocument(doc11);
      indexWriter.close();
  }

.1-2 读取代码

        Directory directory = FSDirectory.open(Paths.get("/Users/waixingren/bigdata-java/mysolr52test/lucenecountdata"));
        DirectoryReader reader = DirectoryReader.open(directory);
        IndexSearcher isearcher = new IndexSearcher(reader);
        Query filter1 = new TermQuery(new Term("desc","cubeli"));
        Query filter2 = NumericRangeQuery.newIntRange("id", 6, 11, true, true);//这里会生成一个multitermquery,因为相比于上一个termquery的一个值,这个query会有多个值,比如7,8,9,10

        BooleanQuery bq = new BooleanQuery();
        bq.add(filter1, Occur.MUST);
        bq.add(filter2, Occur.MUST);//两个都是MUST,表示要求交集

        TopDocs topDocs = isearcher.search(bq, Integer.MAX_VALUE);
        ScoreDoc scoreDocs[] = topDocs.scoreDocs;
        for(int i = 0; i < scoreDocs.length; i++){

            Document document = isearcher.doc(scoreDocs[i].doc);
            System.out.println(document.get("id") + ", " + document.get("name") + ", " + document.get("desc"));
        }

.2 源码分析

.2-1createweight

这里写图片描述
如上图所示,这里会构造一个BooleanWeight,在构造的过程中,使用子query生成多个子weight,添加到一个list中,作为BooleanWeight的一个成员变量weights.

.2-1-1 TermQuery构造weight

这里写图片描述
这里的seekExact方法,就是先判断这个term是否存在,详细解析见

.2-1-2 MultiTermQueryConstantScoreWrapper构造weight

这里写图片描述

.2-2 构造scorer

这里写图片描述
尝试使用第一个weight构造scorer,如果失败,就返回null,例如如果是求交集,那么使用一个scorer是不行的:
这里写图片描述
所以,要走以下流程构造scorer:
这里写图片描述

注意,对于multiterm来说,需要遍历所有的term值,例如:
这里写图片描述

.2-3 求交集/并集/差集

未完待续。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值