现在的位置: 首页 > 综合 > 正文

lucene笔记(一)

2013年10月05日 ⁄ 综合 ⁄ 共 1871字 ⁄ 字号 评论关闭
Searcher类的方法

  public final Hits search(Query query) throws IOException {
    return search(query, (Filter)null);
  }
发现原来是调用另一个重载的search类哦
  public Hits search(Query query, Filter filter) throws IOException {
    return new Hits(this, query, filter);
  }
发现原来是构造一个Hits对象哦,参数是search本身,query和filter
那么循着足迹到了Hits类的构造方法,看他到底做了什么
  Hits(Searcher s, Query q, Filter f) throws IOException {
    weight = q.weight(s);//这里发现一个方法
    searcher = s;
    filter = f;
    nDeletions = countDeletions(s);
    getMoreDocs(50); // retrieve 100 initially
    lengthAtStart = length;
  }
转到weight方法
  public Weight weight(Searcher searcher)
    throws IOException {
    Query query = searcher.rewrite(this);//发现一个方法
    Weight weight = query.createWeight(searcher);//发现方法2
    float sum = weight.sumOfSquaredWeights();
    float norm = getSimilarity(searcher).queryNorm(sum);
    weight.normalize(norm);
    return weight;
  }
转到rewrite方法
abstract public Query rewrite(Query query) throws IOException;
发现是个抽象方法哦,Search类不是有个子类IndexSearch吗?那找他去
  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;
  }
果真重写了哦,但是调用的居然是query的rewrite方法,看看去
  public Query rewrite(IndexReader reader) throws IOException {
    return this;
  }
居然只是把自己返回去,IndexSearch方法一样是把这个query没做任何修改返回了,那么再看query.createWeight方法
  protected Weight createWeight(Searcher searcher) throws IOException {
    throw new UnsupportedOperationException();
  }
- -抛个异常啊,看来又得子类重写了,那么随便找个子类把,看个简单的 PhraseQuery 吧。
  protected Weight createWeight(Searcher searcher) throws IOException {
    if (terms.size() == 1) {              // optimize one-term case
      Term term = (Term)terms.elementAt(0);
      Query termQuery = new TermQuery(term);
      termQuery.setBoost(getBoost());
      return termQuery.createWeight(searcher);
    }
    return new PhraseWeight(searcher);
  }
果然重写了setBoost()父类的方法设置boost值,getBoost(),获得Boost,默认的是1.0f
待续......................

抱歉!评论已关闭.