Lucene.Net 索引更新,当在 SQL 数据库中完成手动更改时

Lucene.Net index updates, when a manual change is done in SQL Database

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

我可以提供有关如何执行此操作的概念性概述。从根本上说,你需要三样东西。

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

当然有很多不同的方法来处理这些问题。

1) 了解哪些数据发生了变化

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

2) 变更日志

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

3) 将更改应用于 LuceneNet

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

可以添加更多的附加功能,但这应该可以让您清楚地了解如何实现近乎实时地保持 LuceneNet 索引最新的方法。