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の中身を調査する…