将Lucene存储库与源数据同步的最佳实践?

将Lucene存储库与源数据同步的最佳实践?,lucene,lucene.net,Lucene,Lucene.net,我正在设计一个应用程序,它将非常依赖于使用Lucene.NET存储库进行搜索。存储库将使用不断变化的操作数据库中的数据构建。我正试图找出保持Lucene存储库与源数据库同步的最佳策略。我是否应该运行一个每隔几分钟唤醒一次的服务,查询数据库中更新的记录,并从Lucene索引中添加/删除?我是否应该每晚重建Lucene存储库并容忍数据延迟 在Lucene存储库中保存数据的最佳实践是什么?不同的策略如何影响延迟、性能等?Lucene能够执行所谓的近实时搜索,这意味着索引的更新几乎可以立即在查询结果中看

我正在设计一个应用程序,它将非常依赖于使用Lucene.NET存储库进行搜索。存储库将使用不断变化的操作数据库中的数据构建。我正试图找出保持Lucene存储库与源数据库同步的最佳策略。我是否应该运行一个每隔几分钟唤醒一次的服务,查询数据库中更新的记录,并从Lucene索引中添加/删除?我是否应该每晚重建Lucene存储库并容忍数据延迟


在Lucene存储库中保存数据的最佳实践是什么?不同的策略如何影响延迟、性能等?

Lucene能够执行所谓的近实时搜索,这意味着索引的更新几乎可以立即在查询结果中看到。因此,一旦更新保存在数据库中,您就可以免费发送更新——Lucene在处理非常频繁的更新时应该没有问题,例如Twitter搜索就是用它构建的(当然,为了保持如此大的负载,您需要分发索引)


所以,您最好在提交事务后触发的代码中发送更新。在不知道您使用的是什么数据库或队列系统的情况下,很难说得更具体。关于这个问题的一些一般想法,以及将其与CouchDB或RabbitMQ一起使用的示例如所示

这样做的目的是永远不要从头开始重建Lucene存储库?您在应用程序诞生时构建它一次,然后继续向它提供更新?或者,时不时地重建索引是一种好的做法吗?除非您被迫这样做(例如,数据结构的更改),否则永远不应重建索引。索引通过所谓的“合并策略”保持良好状态(您可以在Web上找到很多)。如果你预测了很多删除操作,那么你可以考虑运行<代码>优化器()/代码>偶尔删除文档并减小索引的大小(只删除标记为删除的文档)。