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

问题描述:

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

将Lucene资源库中的数据保持新鲜的最佳做法是什么?不同的策略如何影响延迟,性能等?

+0

你是怎么接近这个的? –

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

因此,最好是在发送事务后触发的代码中发送更新。很难说更具体的东西,不知道你使用的是什么数据库或排队系统。关于此事的一些一般性想法以及与CouchDB或RabbitMQ一起使用的示例显示在elasticsearch river documentation中。

+1

所以意图是你*永远不会从头重建Lucene存储库?你在应用程序诞生时就构建过一次,然后继续为它提供更新?或者是一次又一次地重建它的好习惯? – RationalGeek

+2

除非您被迫这样做(例如,通过更改数据结构),否则不应该重建索引。通过所谓的“合并策略”,索引保持良好状态(您可以在网上找到很多索引)。如果预测了很多删除操作,那么你可能会考虑每隔一段时间运行'optimize()'来真正移除文档并减小索引的大小(删除操作只会将文档标记为已删除)。 –

+0

好的信息谢谢。 – RationalGeek