我是Lucene.Net的新手,目前正在进行研发,以将其用于.Net应用程序。由于Lucene.Net是一个通用库,等等。它只知道你有一个Lucene文档,你想要索引。所以当我们从任何数据源转储数据到Lucene.Net时。我们如何使Lucene.Net文档更新为SQL数据库中的数据(例如)。保持两个数据(即Lucene.Net和SQL)同步的一种方法是在每次数据库更新期间不断更新Lucene索引。我们还知道,有一种可能性,有人可以手动更改SQL数据库,在这种情况下,我们如何更新Lucene索引?
1条答案
按热度按时间mgdq6dx11#
我可以提供一个如何做到这一点的概念性概述。从根本上说,你需要三件事。
1.一种了解sql数据库中的相关数据每次更改的方法。
1.用于捕获有关更改信息的位置,称为更改日志。
1.一个例程,它读取更改日志,将这些更改应用到LuceneNet索引,然后在更改日志中标记已处理的记录。
当然,有很多不同的方法来处理这些问题。
1)了解更改了哪些数据
处理#1的最简单的方法是如果你的数据库支持插入、更新和删除触发器。如果它支持,那么你可以在每个表上添加这三个触发器,这些表为LuceneNet索引提供数据,当这些表中的一个记录改变时,触发器可以自动地将一个记录写入到改变日志中,指示表、记录ID和操作如果你的数据库不支持触发器,那么这就有点困难了。你可以在执行插入、更新和删除操作时,挂钩到你的应用程序用来与数据库对话的一些常见API,并让挂钩在更改日志中记录同样的信息。
2)更改日志
变更日志可以有很多种形式,但最简单的方法可能是在sql数据库中创建一个表。这样,插入、更新和删除触发器就可以通过在changeLog表中插入一条记录来直接记录它们的观察结果。如果你从api Package 器向它写入数据,也可以将它显示为sql数据库表。
3)将更改应用到LuceneNet
有很多方法可以实现这一点,但最健壮的方法可能是使用计时器来启动后台线程,该线程每隔几秒检查是否存在未处理的changeLog记录。如果它找到这样的记录,则读取它们,检查它是用于插入、更新还是删除操作,以及用于哪个表和记录ID。如果是插入或更新,它从sql数据库中读取记录,并在LuceneNet中插入或更新rec。如果是已删除的,则直接删除LuceneNet中的记录。然后它在changeLog记录上设置一个布尔值,以指示该记录已被处理。
有更多的花里胡哨的东西可以添加,但这应该给予你一个相当清晰的画面,如何实现一种方法,使LuceneNet索引保持最新的近真实的。