如何解决Lucene.Net 索引更新,当在 SQL 数据库中进行手动更改时 1) 了解哪些数据发生了变化2) 变更日志3) 将更改应用到 LuceneNet
我是 Lucene.Net 的新手,目前正在进行研发以将其用于 .Net 应用程序。由于 Lucene.Net 是一个通用库,它与 sql Server、sqlite 等数据源无关。它只知道你有一个你想要索引的 Lucene 文档。所以当我们从任何数据源将数据转储到 Lucene.Net 时。我们如何使 Lucene.Net 文档更新为 sql 数据库中的数据(例如)。保持这两种数据(即(Lucene.Net 和 sql)同步)的一种方法是在每次数据库更新期间不断更新 Lucene 索引。我们也知道有人可以手动更改 sql 数据库,在这种情况下我们如何更新 Lucene 索引?
解决方法
我可以提供有关如何执行此操作的概念性概述。从根本上说,您需要三样东西。
- 每次sql数据库中相关数据发生变化时的一种获知方式
- 一个用于捕获有关该更改的信息的地方,称为更改日志。
- 读取更改日志、将这些更改应用于 LuceneNet 索引并标记更改日志中的记录已处理的例程。
当然有很多不同的方法来处理每一种。
1) 了解哪些数据发生了变化
处理#1 的最简单方法是您的数据库是否支持插入、更新和删除触发器。如果是这样,那么您可以在向 LuceneNet 索引提供数据的每个表上添加这三个触发器,并且当这些表中的一个表中的记录发生更改时,触发器可以自动将一条记录写入更改日志,指示该表、记录 ID 和操作(插入、更新、删除)。如果您的数据库不支持触发器,那就有点难了。在执行插入、更新和删除操作时,您可以挂钩到应用程序用来与数据库通信的一些常见 API,并让该挂钩在更改日志中记录相同类型的信息。
2) 变更日志
更改日志可以有多种形式,但最简单的方法可能是在 sql 数据库中创建一个表。通过这种方式,插入、更新和删除触发器可以通过将记录插入到 changeLog 表中来直接记录它们的观察结果。如果您从 api 包装器写入它,将其显示为 sql 数据库表也可以工作。
3) 将更改应用到 LuceneNet
有很多方法可以实现这一点,但最可靠的方法可能是使用计时器启动后台线程,每隔几秒检查一次未处理的 changeLog 记录的存在。如果它找到这样的记录,它就会读入它们,检查它是用于插入、更新还是删除操作,以及用于哪个表和记录 ID。如果插入或更新,则从 sql 数据库中读取记录并在 LuceneNet 中插入或更新记录。如果为删除则直接删除LuceneNet中的记录。然后它在 changeLog 记录上设置一个布尔值以指示该记录已被处理。
可以添加更多花里胡哨的东西,但这应该让您非常清楚地了解如何实施一种方法来使 LuceneNet 索引近乎实时地保持最新状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。