Hubble.net 将全文搜索和关系数据库整合到一起,通过SQL语句对数据库中的数据进行全文和关系查询。Hubble.net 组件本身负责对全文数据进行倒排索引,并将索引存储到指定的目录下,数据的存储则由和Hubble.net 关联的关系数据库完成。Hubble.net 提供了一个 IDBAdpter 接口,用户可以根据这个接口实现自定义的数据库适配。如何添加自定义的数据库适配器,将在数据库适配器一节中阐述。建立倒排索引时需要对输入的全文文本进行分词,Hubble.net 为用户提供了一个 IAnalyzer 接口来完成自定义的分词器。如何添加自定义的分词器,将在分词器一节中阐述。Hubble.net 在安装后以一个系统服务的形式存在。 Hubble.net 提供一个 Hubble.SQLClient 组件来和Hubble.net 的系统服务进行交互,SQLClient 的接口和Ado.net 中的SqlClient接口类似,具体将在SQLClient一节中阐述。
Hubble.net 和 关系数据库一样,存在数据库和数据库表的概念。Hubble.net 的数据库和数据表只是提供一个和对应关系数据库的映射描述关系,并不存在数据库和数据表的实体。用户在通过SQL 语句操作Hubble.net 的数据库和数据表时,Hubble.net 将自动和对应的关系数据库实体进行关联,从用户侧看,Hubble.net就像一个数据库实体。
Hubble.net 负责建立文本字段的倒排索引和Untokenized字段的单值索引。关系数据库负责建立B+树索引。这些索引如何协调工作将在本章的后续小节中详细介绍。
Active Table 的特点是通过 hubble.net 更新索引时会同步更新数据库中对应的数据表,对hubble.net 的 active table 进行创建,删除,截断等操作时,hubble.net 也会联动的创建,删除,截断数据库中对应的表。Active table 一般用于实时性要求非常高的应用中,索引和数据可以实施更新。
Active Table 在建表语句中体现为 IndexOnly 属性为 False.
如上图所示,这是一个典型的主动更新数据表的数据流图。
创建,删除,增删改等SQL 语句由 Hubble.SQLClient 发起,到达Hubble.Core,Hubble.Core 首先更新对应的关系数据库中的表,然后更新Hubble.net的全文索引。从这个数据流图我们可以看出,关系数据库和全文索引是同步更新的,这样就保证了数据的实时性。
Active table 有着实时性强的优点,但在对现有数据库应用系统构建全文索引时,往往我们希望直接在现有数据表的数据基础上实现全文索引功能,而不是通过 Hubble.net 来创建一个新的数据表,这是我们就不能采用 Active Table 而必须才行 Passive Table 来构建全文索引。
Passive Table 在建表语句中体现为 IndexOnly 属性为 True.
上图是一个典型的被动更新数据表的数据流图。
关系数据库的数据更新后,hubble.net 并不会立即更新索引,需要通过 QueryAnalyzer 或者第三方的程序 (后续版本中,hubble.net 的服务端将集成一个简单的哦自动更新模块) 读取关系数据库中对应表的变化信息,然后将变化信息转变为 insert , update 或者 delete 这样的SQL 语句发送给 Hubble.Core ,Hubble.Core 构建相应的全文索引。
上图为hubble.net 全文数据检索(即执行 Select 语句)的数据流图。检索指令从 SQLCLient 发送到Hubble.Core 后,Hubble.Core 将先进行查询优化,将查询语句进行分解并分析,根据分析结果分别到全文索引,单值索引或者关系数据库中进行检索并将检索得到的结果汇总到Hubble.Core 中,根据排序字段排序然后输出给SQLClient。
这个检索流程对应主动和被动方式的数据表都是相同的。
这个属性指明数据表是主动更新模式还是被动更新模式。
这个属性指明表的全文索引建立到那个目录下
这个属性指明关系数据库中对应表的名称
这个属性指明采用哪种数据库适配器访问关系数据库
这个属性指明访问关系数据库的连接字符串
这个属性只有 Passive Table 才有,可以指定关系数据库中对应数据表里面某个字段为Hubble.net 的 DocId 字段。
这些属性具体如何在建表语句中表述,我将在建表一节详细说明。