2005.09.12 株式会社四次元データ 宮澤了祐
3.3. 検索結果
検索結果はHitsというDocumentの集合体として与えられます。
IndexSearcher searcher = new IndexSearcher(index); Query query = QueryParser.parse(queryString,"content",analyzer); Hits hits = searcher.search(query); for(int i=0; i <hits.length(); i++){ Document doc = hits.doc(i); System.out.println(doc.get("url"); System.out.println(hits.score(i); }
Hitsオブジェクトの中で文書はスコア順に並んでいます。 スコアはインデックスを作成する際にorg.apache.lucene.search.Similarityクラスによって 定めた計算式によって求められます。
指定しない場合はLucene標準の計算法でScoreが求められます。以下はHitsクラスのメソッド一覧です。
- doc(int number)
- 指定した順番のDocumentクラスを返します。文書はスコア順に並んでいます。
- length()
- 検索にヒットした文書の数を返します。
- id(int number)
- 検索結果number番目の文書のインデックスのIDを返します。
doc(n)
とIndexReadeの.document(Hits.id(n))
は同義です。 - score(int number)
- スコアを返します。
詳しい計算結果を見たい場合は、IndexSearcheの.explain(Query query, int number)メソッドを実行すると見ることが出来ます。 第二引数のnumberはHitsの中での順番ではなく、インデックスのIDです。 IDはHitsのid(int number)メソッドで取得することが出来ます。
org.apache.lucene.search.Similarity
Scoreは次の要素によって計算されます
- ある語句の文書の中での出現頻度
- 語句のインデックスの中での出現頻度
- 文書が特定のFieldに対して保有している語句の数
- 文書が保有している語句の数とある語句の文書の中での出現頻度
これらの要素を元にした計算結果を乗算することで、あるドキュメントのある語句に対するスコアが求まります。 もし独自に設定する場合はこれらの関数を実装する必要があります。 実装したSimilarityをIndexSearcherにセットすることで、独自のスコアに従った検索順とすることが出来ます。
IndexSearcher searcher = new IndexSearcher(index); searcher.setSimilarity(new mySimilarity());