lucene2.4源码学习7 构建查询树 rewrite

搜索结果的排序需要搜索得分的计算,计算得分与查询条件有关。所以第一步就是构建查询条件。
源码中的Weight 就是计算得分的方法,这个是依赖查询条件的构建的。
  public Weight weight(Searcher searcher)
    throws IOException {
    Query query = searcher.rewrite(this);
    Weight weight = query.createWeight(searcher);
    float sum = weight.sumOfSquaredWeights();
    float norm = getSimilarity(searcher).queryNorm(sum);
    weight.normalize(norm);
    return weight;
  }


查询条件的构建是有rewrite来实现的。

 public Query rewrite(Query original) throws IOException {
    Query query = original;
    for (Query rewrittenQuery = query.rewrite(reader); rewrittenQuery != query;
         rewrittenQuery = query.rewrite(reader)) {
      query = rewrittenQuery;
    }
    return query;
  }


这是一个递归,也就是一个查询树,查询条件 子查询条件,继续子查询条件。

最重要的两个查询:BooleanQuery和TermQuery,我们来看看他们的rewrite

BooleanQuery:

 public Query rewrite(IndexReader reader) throws IOException {
    if (minNrShouldMatch == 0 && clauses.size() == 1) {                    // optimize 1-clause queries
      BooleanClause c = (BooleanClause)clauses.get(0);
      if (!c.isProhibited()) {			  // just return clause

        Query query = c.getQuery().rewrite(reader);    // rewrite first

        if (getBoost() != 1.0f) {                 // incorporate boost
          if (query == c.getQuery())                   // if rewrite was no-op
            query = (Query)query.clone();         // then clone before boost
          query.setBoost(getBoost() * query.getBoost());
        }

        return query;
      }
    }


注意
 query.setBoost(getBoost() * query.getBoost());

在BooleanQuery中是把query的boost set进去了的。


TermQuery:
 public Query rewrite(IndexReader reader) throws IOException {
    return this;
  }

TermQuery的就很简单了,就是返回自己。

你可能感兴趣的:(rewrite)