Apache Lucene の仕組みを理解する!!

Apache Lucene の内部はどのようになっているのか?と疑問に感じたので、とりあえず、調べたところをメモしていきます。

サンプルに含まれているsrc/demoに含まれているソース「SearchFiles.java」から検索処理を見てみることに。

147行目あたり。これが、検索のメソッド呼出でしょう。
■SearchFiles.java

    Searcher searcher = new IndexSearcher(reader);
    //中略...
    searcher.search(query, null, 100);

■IndexSearcher.java

  /** Finds the top <code>n</code>
   * hits for <code>query</code>, applying <code>filter</code> if non-null.
   *
   * @throws BooleanQuery.TooManyClauses
   */
  public TopDocs search(Query query, Filter filter, int n)
    throws IOException {
    return search(createWeight(query), filter, n);
  }

TopDocsというのが、検索結果のドキュメントのようです。

  public TopDocs search(Weight weight, Filter filter, final int nDocs)
       throws IOException {

    if (nDocs <= 0)  // null might be returned from hq.top() below.
      throw new IllegalArgumentException("nDocs must be > 0");

    TopDocCollector collector = new TopDocCollector(nDocs);
    search(weight, filter, collector);
    return collector.topDocs();
  }

「Collector」というオブジェクトは、その名前からして、検索結果を収集するためのオブジェクトのようです。

  public void search(Weight weight, Filter filter,
                     final HitCollector results) throws IOException {

    Scorer scorer = weight.scorer(reader);
    if (scorer == null)
      return;

    if (filter == null) {
      scorer.score(results);
      return;
    }
//省略…

weightの中身を調査する…