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
というエラーが発生しました。渡す有効な値を提案してください。
search.Searcher.search
メソッドは search.Sort
パラメータ。次のように簡単に作成できます。
new Sort("my_sort_field")
ただし、並べ替えることができるフィールドにはいくつかの制限があります。インデックスを作成する必要がありますが、トークン化する必要はなく、値はString
s、Float
s、またはInteger
sに変換できます。
Lucene in Action すべての詳細をカバーし、複数のフィールドでソートするなど。
Luceneの元の(Java)バージョンでは、TopFieldDocCollector
結果のサイズに厳しい制限はありません。ゼロより大きい数値はすべて受け入れられます。メモリの制約とパフォーマンスの低下により、環境に応じて実際的な制限が生じますが、5000ヒットは取るに足らないものであり、モバイルデバイスの外部で問題を引き起こすことはありません。
おそらくLuceneの移植で、TopFieldDocCollector
は、Luceneの「ヒープ」実装(PriorityQueue
と呼ばれ、FieldSortedHitQueue
によって拡張された)以外のものを使用するように変更されました。これは、不当に小さな制限を課すものです。結果のサイズ。その場合は、TopFieldDocCollector
のソースコードを確認し、より優れたヒープ実装を使用して独自の同様のヒットコレクターを実装することをお勧めします。
しかし、なぜ5000の結果を収集しようとしているのですか?インタラクティブアプリケーションのユーザーは、それほど多くを見たいとは思わないでしょう。 200件の結果を喜んで見るユーザーはまれだと思いますが、安全率として2倍の400件になります。アプリケーションによっては、結果のサイズを制限すると、悪意のあるスクリーンスクレイパーが妨げられ、サービス拒否攻撃も軽減される可能性があります。
文字列フィールド名のみを受け入れる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);
あなたが探しているのはおそらく TopFieldDocCollector です。 GroupingHitCollector
(それは何ですか?)の代わりに、またはその中に使用してください。
さらに情報が必要な場合は、これについてコメントしてください。喜んでお手伝いさせていただきます。