16

次のコードを使用して、Lucene.Net でクエリを実行しています。

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

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


アップデート

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

4

4 に答える 4

25

このメソッドは、次のように簡単に構築できるパラメーターsearch.Searcher.searchを受け入れます。search.Sort

new Sort("my_sort_field")

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

Lucene in Actionは、複数のフィールドによるソートなどと同様に、すべての詳細をカバーしています。

于 2009-01-30T23:04:40.350 に答える
0

文字列フィールド名のみを受け入れる 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);
于 2016-04-06T18:09:26.650 に答える
0

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

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

于 2009-02-01T08:01:02.077 に答える
0

Lucene の元の (Java) バージョンでは、TopFieldDocCollector結果のサイズに厳密な制限はありません。ゼロより大きい任意の数値が受け入れられます。メモリの制約とパフォーマンスの低下により、実際の制限は環境によって異なりますが、5000 ヒットは些細なことであり、モバイル デバイス以外では問題になることはありません。

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

しかし、なぜ 5000 件の結果を収集しようとしているのですか? 対話型アプリケーションのユーザーは、それほど多くの情報を見たいとは思わないでしょう。200 件の結果を喜んで見ようとするユーザーはまれだと思いますが、安全のために 2 倍の 400 件にします。アプリケーションによっては、結果のサイズを制限することで、悪意のあるスクリーン スクレイパーを阻止し、サービス拒否攻撃を軽減することもできます。

于 2009-02-19T18:22:33.710 に答える