Jaimie が説明した解決策に同意します。しかし、検索エンジンの一般的なメカニズムを理解するのに役立つ、知っておくべきもう 1 つの側面を指摘したいと思います。
TopDocCollector を使用すると、結果がスコアまたはその他の並べ替え基準で並べ替えられる前に、検索クエリに一致するヒットをどれだけ収集するかを定義できます。
次の例を参照してください。
collector = TopScoreDocCollector.create(9999, true);
searcher.search(parser.parse("Clone Warrior"), collector);
// get first page
topDocs = collector.topDocs(0, 10);
int resultSize=topDocs.scoreDocs.length; // 10 or less
int totalHits=topDocs.totalHits; // 9999 or less
ここで Lucene に、検索フレーズ「Clone Warrior」を含む最大 9999 個のドキュメントを収集するように指示します。つまり、インデックスにこの検索フレーズを含む 9999 を超えるドキュメントが含まれている場合、コレクターは 9999 ヒットでいっぱいになると停止します。
これは、MAX_RESULTS を選択すると、より良い検索結果になることを意味します。ただし、これは、多数のヒットが予想される場合にのみ関係します。一方、「ルーク スカイウォーカー」を検索してヒットが 1 つしかないと予想される場合は、MAX_RESULTS を 1 に設定することもできます。
そのため、MAX_RESULTS を変更すると、収集されたヒットに対してソートが実行されるため、返される scoreDocs に影響を与える可能性があります。実際には、MAX_RESULTS を十分に大きなサイズに設定して、人間のユーザーが特定のドキュメントを見逃すことを主張できないようにすることです。この概念は、常に完全なデータ プールを考慮する SQL データベースの動作とはまったく逆です。
しかし、lucene は別のメカニズムもサポートしています。コレクターの MAX_RESULTS を定義する代わりに、結果セットを待機する時間を定義することもできます。たとえば、300 ミリ秒後に常にコレクターを停止するように定義できます。これは、パフォーマンスの問題からアプリケーションを保護するための優れたアプローチです。ただし、関連するすべてのドキュメントを確実にカウントしたい場合は、MAX_RESULTS のパラメーターまたは最大待機時間を無制限の値に設定する必要があります。