eaglet

本博专注于基于微软技术的搜索相关技术
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HubbleDotNet 的数据表分为主动模式和被动模式两种,如果是主动模式(IndexOnly=false),HubbleDotNet 会和数据库中对应的表联动,即更新HubbleDotNet时会自动更新数据库中对应的表。但在被动模式(IndexOnly=true)下,数据库中对应的表或视图是只读的,这时如何去更新数据呢?

 

image

图1 被动模式下,更新索引和数据

 

如图1 所示,在被动模式下,更新数据和索引分为两个步骤:

步骤1.

在HubbleDotNet 中执行插入,修改或删除语句,完成全文索引的更新。

步骤2.

在数据库中执行插入,修改和删除语句,完成数据的更新。

 

插入时先步骤2后步骤1

删除时先步骤1后步骤2

修改时情况有点复杂,

如果绑定的是表,两个步骤的顺序无所谓,

如果是视图,先步骤1,后步骤2肯定不会出错(不过如果数据库更新失败,索引回滚是个比较麻烦的事情)

如果先步骤2后步骤1,要看视图有没有什么特殊条件,即必须要保证在修改了数据库对应的表后,通过表对应的主键依然可以从视图中得到记录。


 

注意:

1、如果要执行 Update 和 Delete 操作,被动表必须以 Append, Delete,Update 这种模式创建,如果以Append only 模式创建,则不能更新和删除只能增量。

2、如果是批量插入,避免用循环语句一条一条插入,这样做效率很低,要用批量插入语句,即一次输入多条insert 语句,insert 语句之间以分号分隔。如:

insert table values('Hello world', 0);

insert table values('Good news', 1);

 

通过用户自己的程序来控制被动表索引和数据的更新是推荐的方式,这种方式下用户可以根据自己的实际情况去设计同步的策略,最灵活且效率最高。如果怕麻烦,HubbleDotNet 将在0.9 版本推出一个自动更新被动表索引的功能,这个功能实际上是在数据库中加入了一个触发器,数据库更新时会通过触发器将更新的记录号和字段名记录在一个记录变动表中,HubbleDotNet 定期去读这个表实现数据的自动更新,这种方式由于要用到触发器,效率上肯定要比用户自己进行同步要低。

 

返回 Hubble.net 技术详解