Lucene で検索を行うには、 org.apache.lucene.search.Searcher クラスの
Hits search(Query query)
メソッドを使う。 このメソッドはデフォルトのスコア付けに基づいて結果を表示する。 フィールドに対してソートした結果を出したい場合は、 次のメソッドを使う。
Hits search(Query query, Sort sort)
2番目の引数には org.apache.lucene.search.Sort クラスのオブジェクトを渡す。 ソート対象が1つのフィールドの場合は、 コンストラクタ
Sort(String field)
を使って生成したオブジェクトを渡せばよさそうだが、 実際やってみたら、 確かに指定したフィールドの値でソートされるのだが、 フィールドの値が同じときの順番がバラバラで、 スコアが反映されていないような気がする?
ソートしたいフィールドが同点のときにデフォルトのスコアでソートするには、 複数フィールドを指定してオブジェクトを生成してやればいい。 SortField クラスは基本的にフィールドを指定するのだが、 デフォルトのスコア付けというのが特別な書き方があって、 フィールド名を null に指定し、 タイプを SortField.SCORE として、 次のコンストラクタを呼び出す。
SortField(String field, int type)
具体的には、 次のような処理になる。
SortField[] fields = new SortField[2]; fields[0] = new SortField(null, SortField.SCORE); fields[1] = new SortField(DocumentFactory.FIELD_RANK); // JiroSearch 定義の文字列 Hits hits = searcher.search(query, new Sort(fields));