目次へ

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.DOCindexに登録されている文書順に並べ替えます。フィールド名が指定されていても無視されます。
SortField.FLOATFloat型であることを示します。
SortField.INTInteger型であることを示します。
SortField.STRINGString型であることを示します。

並べ替えは小さい値から大きい値へと並ぶ昇順に行われますが、 降順に並べ替えたい場合はSort(String fieldname, boolen reverse)コンストラクタを使用します。 第二引数をtrueにすれば、並べ替えは降順に行われます。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp