当SQL数据库中进行手动更改时,Lucene.Net索引会更新



我是Lucene.Net的新手,目前正在做R&D将其用于.Net应用程序。由于Lucene.Net是一个通用库,它与SQL Server、SQLite等数据源无关。它只知道你有一个想要索引的Lucene文档。因此,当我们从任何数据源向Lucene.Net转储数据时。我们如何使Lucene.Net文档保持最新,因为数据在SQL数据库中(例如(。保持两个数据(即Lucene.Net和SQL(同步的一种方法是在每次数据库更新期间不断更新Lucene索引。我们还知道,有人可以手动更改SQL数据库,在这种情况下,我们如何更新Lucene索引?

我可以提供如何做到这一点的概念概述。从根本上讲,你需要三样东西。

  1. 每次sql数据库中的相关数据发生更改时都可以知道的方法
  2. 一个获取有关该更改信息的地方,称之为更改日志
  3. 一个例程读取更改日志,将这些更改应用于LuceneNet索引,然后在更改日志中标记已处理的记录

当然有很多不同的方法来处理每一种。

1( 了解更改的数据

处理#1的最简单方法是数据库是否支持插入、更新和删除触发器。如果是这样,那么您可以在向LuceneNet索引提供数据的每个表上添加这三个触发器,当其中一个表中的记录发生更改时,触发器可以自动将一条记录写入更改日志,指示表、记录id和操作(插入、更新、删除(。如果你的数据库不支持触发器,那就有点难了。你可以挂接一些常见的api,你的应用程序在插入、更新和删除时使用这些api与数据库对话,并让该挂接在更改日志中记录相同的信息。

2( 更改日志

更改日志可以采用多种形式,但最简单的方法可能只是在sql数据库中创建一个表。通过这种方式,插入、更新和删除触发器可以通过在changeLog表中插入一条记录来直接记录它们的观察结果。如果您是从api包装器向其进行写入,那么将其显示为sql数据库表也是可行的。

3( 将更改应用于LuceneNet

有很多方法可以实现这一点,但最稳健的可能是使用计时器启动后台线程,该线程每隔几秒钟就会检查是否存在未处理的变更日志记录。如果它找到这样的记录,它会读取它们,检查它是否用于插入、更新或删除操作,以及哪个表和记录ID。如果是插入或更新,它会从sql数据库中读取记录,并在LuceneNet中插入或更新rec。如果是已删除的,则直接删除LuceneNet中的记录。然后,它在changeLog记录上设置一个布尔值,以指示该记录已被处理。

可以添加更多的提示,但这应该会让您非常清楚地了解如何实现一种使LuceneNet索引接近实时更新的方法。

最新更新