web-dev-qa-db-ja.com

HitCollectorを使用してLuceneの結果をフィールド値で並べ替えるにはどうすればよいですか?

Lucene.Netでクエリを実行するために次のコードを使用しています

var collector = new GroupingHitCollector(searcher.GetIndexReader());
searcher.Search(myQuery, collector);
resultsCount = collector.Hits.Count;

これらの検索結果をフィールドに基づいて並べ替えるにはどうすればよいですか?


更新

ありがとう あなたの答えTopFieldDocCollectorを使用しようとしましたが、"value is too small or too large"numHits引数値として渡したときに、5000というエラーが発生しました。渡す有効な値を提案してください。

16
Ed.

search.Searcher.search メソッドは search.Sort パラメータ。次のように簡単に作成できます。

new Sort("my_sort_field")

ただし、並べ替えることができるフィールドにはいくつかの制限があります。インデックスを作成する必要がありますが、トークン化する必要はなく、値はStrings、Floats、またはIntegersに変換できます。

Lucene in Action すべての詳細をカバーし、複数のフィールドでソートするなど。

25
James Brady

Luceneの元の(Java)バージョンでは、TopFieldDocCollector結果のサイズに厳しい制限はありません。ゼロより大きい数値はすべて受け入れられます。メモリの制約とパフォーマンスの低下により、環境に応じて実際的な制限が生じますが、5000ヒットは取るに足らないものであり、モバイルデバイスの外部で問題を引き起こすことはありません。

おそらくLuceneの移植で、TopFieldDocCollectorは、Luceneの「ヒープ」実装(PriorityQueueと呼ばれ、FieldSortedHitQueueによって拡張された)以外のものを使用するように変更されました。これは、不当に小さな制限を課すものです。結果のサイズ。その場合は、TopFieldDocCollectorのソースコードを確認し、より優れたヒープ実装を使用して独自の同様のヒットコレクターを実装することをお勧めします。

しかし、なぜ5000の結果を収集しようとしているのですか?インタラクティブアプリケーションのユーザーは、それほど多くを見たいとは思わないでしょう。 200件の結果を喜んで見るユーザーはまれだと思いますが、安全率として2倍の400件になります。アプリケーションによっては、結果のサイズを制限すると、悪意のあるスクリーンスクレイパーが妨げられ、サービス拒否攻撃も軽減される可能性があります。

0
erickson

文字列フィールド名のみを受け入れるSortのコンストラクターが減価償却されました。ここで、並べ替えオブジェクトを作成し、それを searcher.Search() の最後のパラメーターとして渡す必要があります。

/* sorting by a field of type long called "size" from greatest -> smallest 
(signified by passing in true for the last isReversed paramater)*/

Sort sorter = new Sorter(new SortField("size", SortField.Type.LONG, true))
searcher.Search(myQuery, collector, sorter);
0
toinetoine

あなたが探しているのはおそらく TopFieldDocCollector です。 GroupingHitCollector(それは何ですか?)の代わりに、またはその中に使用してください。

さらに情報が必要な場合は、これについてコメントしてください。喜んでお手伝いさせていただきます。

0
itsadok