如何优雅地终止Lucene NRT读写器的进程?

如何优雅地终止Lucene NRT读写器的进程?,lucene,lucene-nrt,Lucene,Lucene Nrt,我们在应用程序中使用Lucene的近实时搜索功能进行全文搜索。由于提交成本很高,假设我们在每添加10个文档后就提交索引(我们预计每小时索引大约150到200个文档)。现在,如果我想终止进程,如何确保在进程终止之前将内存中的所有文档提交到磁盘?这里有推荐的方法吗?还是我的文档量太少而无暇顾及,我应该在每次添加时都提交 我应该跟踪所有未提交的文档吗?如果进程在提交到磁盘之前被终止,我应该在进程启动时再次索引这些未提交的进程吗 Lucene NRT用于运行嵌入式Jetty的流程。向jetty发送关闭命

我们在应用程序中使用Lucene的近实时搜索功能进行全文搜索。由于提交成本很高,假设我们在每添加10个文档后就提交索引(我们预计每小时索引大约150到200个文档)。现在,如果我想终止进程,如何确保在进程终止之前将内存中的所有文档提交到磁盘?这里有推荐的方法吗?还是我的文档量太少而无暇顾及,我应该在每次添加时都提交

我应该跟踪所有未提交的文档吗?如果进程在提交到磁盘之前被终止,我应该在进程启动时再次索引这些未提交的进程吗


Lucene NRT用于运行嵌入式Jetty的流程。向jetty发送关闭命令(调用某个servlet)并等待所有文档提交,然后使用System.exit()终止,这是正确的方法吗?

您可以添加一个钩子来提交servlet方法中的所有缓冲文档,并确保在调用System.exit之前关闭嵌入式servlet容器(可能通过向JVM添加一个)

但这仍然不是完美的。如果进程被终止,所有缓冲数据都将丢失。另一种解决方案是使用软提交。软提交是廉价的提交(不执行fsync),因此如果进程被终止,数据不会丢失(但如果服务器意外关闭,数据仍可能丢失)

总而言之:

  • 停堆钩
    • 最佳吞吐量
    • 如果进程被终止,数据可能会丢失
  • 软提交
    • 如果进程被终止,则不会丢失任何数据
    • 如果服务器意外关闭,数据可能会丢失
  • 硬提交(默认)
    • 完全没有数据丢失
    • 慢速(需要执行fsync)

如何在lucene中进行软提交?在google上搜索时找不到任何资源。抱歉,这是Solr独有的功能。我认为它在Lucene中也是可用的,但是它不是,这意味着如果你想使用它,你必须自己实现它。您可以在上阅读一些关于它的文档,在上阅读一些技术文档(最近的补丁包含一个软提交的工作实现)。