我们正在使用Lucene的近实时搜索功能在我们的应用程序中进行全文搜索。由于提交成本很高,所以我们承诺在每10个文档添加后进行索引(我们预计每小时大约需要150到200个文档进行索引)。现在,如果我想终止我的进程,如何在进程被终止之前确保内存中的所有文档都被提交到磁盘?这里有推荐的方法吗?或者我的文档量太少而无法理解,我是否应该每次添加它?
我应该跟踪所有未提交的文件吗?如果进程在提交到磁盘之前被杀死,那么我应该在进程启动时再次索引这些未提交的进程吗?
Lucene NRT用于运行嵌入式Jetty的进程。是否正确的方法是将一个shutdown命令(调用一些servlet)发送到jetty并等待所有文件都提交然后使用System.exit()终止?
答案 0 :(得分:0)
您可以添加一个钩子来提交servlet的destroy方法中的所有缓冲文档,并确保在调用System.exit之前关闭嵌入式servlet容器(可能通过添加shutdown hook到JVM)。
但这仍然不完美。如果您的进程被终止,则所有缓冲的数据都将丢失。另一种解决方案是使用软提交。软提交是廉价提交(不执行fsync),因此如果您的进程被终止,数据不会丢失(但如果服务器意外关闭,数据仍可能丢失)。
总结一下: