【问题标题】:Lucene.Net index updates, when a manual change is done in SQL Database在 SQL 数据库中进行手动更改时,Lucene.Net 索引更新
【发布时间】:2021-06-22 00:22:51
【问题描述】:

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

【问题讨论】:

    标签: c# sql-server lucene lucene.net


    【解决方案1】:

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

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

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

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

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

    2) 变更日志

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

    3) 将更改应用到 LuceneNet

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

    可以添加更多的花里胡哨,但这应该让您非常清楚地了解如何实施一种方法来使 LuceneNet 索引近乎实时地保持最新。

    【讨论】:

    • 谢谢@RonC。能否请您告诉我另一件事,即 Lucene.Net 可以在一个目录中拥有多少个文档?
    • 文档或索引? Lucene 文档不会直接放在目录中,而是放在 Lucene 索引中。
    • 是的,我的意思是索引。我对目录中索引的数量/计数感兴趣。
    • 本身没有限制。您只会受到操作系统的限制。您可能会达到的第一个操作系统限制是最大打开文件句柄。 (这就是为什么 Lucene 可以选择使用复合索引文件,其中表示索引的许多 lucene 文件在一个 OS 文件中组合在一起)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多