2005.09.12 株式会社四次元データ 宮澤了祐
3.4. 検索結果の絞込み
検索結果の絞りこみを行いたい場合は、BooleanQueryクラスを用います。
Query newQuery = QueryParser.parse(queryString,"content",analyzer); BooleanQuery bQuery = new BooleanQuery(); bQuery.add(oldQuery, true, false); bQuery.add(newQuery, true, false); Hits hits = indexSearcher.search(bQuery);
BooleanQueryのadd()
メソッドで、古いQueryと新しいQueryを結合します。
第二引数は、第一引数のQueryでの検索結果を、新しい検索の検索対象とするかどうかのフラグです。
第三引数は、第一引数のQueryでの検索結果に出現しなかった文書を、新しい検索の対象とするかどうかのフラグです。
古い検索語をQueryPaerserでパースした結果をoldQueryという名前で保存しておきます。 新しいQueryと古いQueryをBooleanQueryのadd()メソッドで結合します。 上記の例では、oldQueryでの検索結果と、newQueryの検索結果の両方に出現する文書が検索結果として現れます。
次に以下のように設定したとします。
BooleanQuery bQuery = new BooleanQuery(); bQuery.add(oldQuery, false, true); bQuery.add(newQuery, true, false); Hits hits = indexSearcher.search(bQuery);
古い検索結果に出現した文書を除いた全ての文書から、新しい検索語とマッチした文書が検索結果として現れます。
3.5. 検索結果のソート
Hitsの内部はLuceneの計算したScore順に並んでいます。 しかし特定の情報によって順番を並べ替えたい場合、「org.apache.lucene.search.Sort」クラスを使用します。 インデックスが付けられている情報であれば、文書の指定したフィールドの値順に並べ替えることが出来ます。 インデックスに登録した順など、Luceneのランク以外の順に並べ替えることが出来ます。 IndexSearcherのsearch()メソッド実行時にSortオブジェクトを指定します。
Sort sort1 = new Sort("number"); Sort sort2 = new Sort(new SortField("url", SortField.STRING )); Sort sort3 = new Sort("url", true); Hits hits1 = indexSearcher.search(query,sort1); Hits hits2 = indexSearcher.search(query,sort2);
オブジェクトの型は、SortFieldクラスを用いて明示的に示すことが出来ます。 もし指定していない場合は、Fieldの先頭のTermの値が数値か文字列かを自動的に取得します。 SortFieldで指定出来るオブジェクトの型には、以下のものがあります。
SortField.AUTO | 自動で取得します。 |
SortField.DOC | indexに登録されている文書順に並べ替えます。フィールド名が指定されていても無視されます。 |
SortField.FLOAT | Float型であることを示します。 |
SortField.INT | Integer型であることを示します。 |
SortField.STRING | String型であることを示します。 |
並べ替えは小さい値から大きい値へと並ぶ昇順に行われますが、 降順に並べ替えたい場合はSort(String fieldname, boolen reverse)コンストラクタを使用します。 第二引数をtrueにすれば、並べ替えは降順に行われます。