1

プロジェクトの 1 つで検索に lucene を使用しています。ポート上で別のサービスとして実行されています。クエリが来るたびに、リクエストがこのサーバーに送信され、結果のマップが返されます。

私の問題は、しばらくすると動作しなくなることです。1日程度で問題なく動作します。しかし、1 日後に結果が返されなくなります (つまり、サービスは実行されていますが、結果は 0 になります)。正常に動作するようにするには、サービスを再起動する必要があります。その後、正常に動作し始めます。

いくつかの解決策を提案してください。必要に応じて、さらに情報を提供させていただきます。

ありがとう。

4

1 に答える 1

0

このような動作を引き起こす可能性のある簡単な間違いを推測するとしたら、時間の経過とともに一連のインデックスライターまたはインデックスリーダーを開き、それらを正しく閉じていないため、サーバーで使用可能なファイル記述子が不足している可能性があります. 「lsof」が「.cfs」、「.fdx」、および/または「.fdt」で多くの開いている記述子を示しているかどうかを確認します (「ulimit -n」を使用して最大数を確認できます)。

私が見てきた問題の原因となる IndexSearcher について注意すべき点が 1 つあります。

サーチャーを閉じても、基になるリーダーが閉じない場合があります。リーダーをサーチャーに渡すと、サーチャーを閉じてもリーダーは閉じられません (その場合、他のオブジェクトで使用されている可能性があるため)。この例:

//Assume I have an IndexWriter named indexwriter, which I reuse.
IndexSearcher searcher = new IndexSearcher(IndexReader.open(indexwriter, true));

//Use the searcher

searcher.close();
//We close the search, but the underlying reader remains open.

これで、閉じられていないリーダーが蓄積され、いくつかのインデックス ファイル記述子が開いたままになります。このパターンが何度も使用されると、時間の経過とともに応答が停止します。とにかくそのようなエラーのその一例。

次のように、サーチャーを閉じるときにリーダーを閉じるだけで修正できますsearcher.getIndexReader().close()。ただし、より良い解決策が見つかる可能性があります。たとえば、インデックスの内容が変更されたときに更新できるリーダーの再利用。

これがあなたが抱えている正確な問題かどうかはわかりませんが、注目に値するかもしれません。

于 2012-11-05T23:20:00.630 に答える