我正在研究一个小型实验性工具,在我们公司内部使用,它可以对存储在我们的自定义CRM软件中的注释进行索引,以进行全文搜索。这些注释存储在Btrieve数据库(名为NOTES.DAT的文件)中。可以使用Pervasive的ADO.NET提供程序连接到数据库并检索用于索引的注释。但是,索引器当前循环遍历每个注释并每5分钟重新编制索引。这似乎非常低效。
不幸的是,我们的CRM软件没有办法向索引服务发出信号已经改变的信号,因为数据库可能存在于远程机器上(并且开发人员不会编写程序到通过网络与我的服务沟通,因为它现在只是一个爱好项目。)
我不想放弃,而是借此机会学习更多关于原始Btrieve数据库的知识。所以,这是我的计划......
必须共享NOTES.DAT文件,因为我们的CRM软件使用Btrieve API而不是ODBC驱动程序(这意味着客户端安装必须能够在网络上查看文件本身)。我想监视这个文件(使用类似FileSystemWatcher?),然后确定更改的字节。使用该信息,我将尝试计算该位置的记录并获取其主键。然后索引器将使用Pervasive的ADO.NET提供程序仅更新该记录。
问题(除了我还不太了解Btrieve文件的结构或者是否可以从原始数据中确定主键的事实)是我不知道如何确定开始和结束范围在NOTES.DAT中更改的字节数。
我可以区分两个版本,但这意味着在某处存储NOTES.DAT的副本(并且它可能非常大,因此是全文索引服务的原因)。
最有效的方法是什么?
谢谢!
编辑:在一个事务中可以添加,编辑或删除多个注释,因此如果可能,该方法需要能够确定多个单独的字节范围。
答案 0 :(得分:1)
如果您的NOTES.DAT
文件存储在NTFS partition上,那么您应该可以执行以下操作之一:
diff
版本N
和N-1
(可能没有重新索引那么慢,但仍然很慢)或diff
$Mft
来确定哪些块在感兴趣的文件的哪些偏移处发生了变化(更复杂,但也更快 - 但仍然没有使用USN期刊快速,可靠和简单)使用USN期刊应该是您的首选方法。您可以使用FSUTIL
实用程序创建和截断USN日志。