我在其中一个项目中使用lucene进行搜索。它作为端口上的单独服务运行。每当查询到来时,都会将请求发送到该服务器,并返回结果图。
我的问题是一段时间后它停止工作。它可以正常工作1天左右。但是1天后,它停止返回结果(即服务正在运行,但结果为0)。为了使其恢复工作,我必须重新启动服务,然后它才能再次正常运行。
请提出一些解决方案。如果需要,我将很乐意提供更多信息。
谢谢。
最佳答案
我是否在猜测一个容易导致该行为的错误,也许是随着时间的流逝打开了一堆索引编写器或索引读取器,而没有正确关闭它们,从而用尽了服务器上可用的文件描述符。查看“ lsof”是否在“ .cfs”,“。fdx”和/或“ .fdt”上显示了很多打开的描述符(可以使用“ ulimit -n”查看最大值)。
关于IndexSearcher需要注意的一件事,我已经看到它会引起问题:
关闭搜索器可能不会关闭基础阅读器。如果将阅读器传递给搜索器,则关闭搜索器时不会关闭它(因为在这种情况下,其他对象可能正在使用它)。
一个例子:
//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()
。不过,可以找到更好的解决方案。重用阅读器,例如,当索引内容更改时可以刷新。不知道这是否是您遇到的确切问题,但可能值得注意。