我在我的一个项目中使用 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()
. 不过,可以找到更好的解决方案。重用阅读器,例如,当索引内容更改时可以刷新阅读器。
不知道这是否是您遇到的确切问题,但可能值得注意。