eaglet

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

HubbleDotNet 开源全文搜索数据库项目--数据库和数据表

Posted on 2010-05-05 15:47  eaglet  阅读(8691)  评论(18编辑  收藏  举报

物理视图

clip_image001

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一节中阐述。

 

逻辑视图

clip_image002

Hubble.net 和 关系数据库一样,存在数据库和数据库表的概念。Hubble.net 的数据库和数据表只是提供一个和对应关系数据库的映射描述关系,并不存在数据库和数据表的实体。用户在通过SQL 语句操作Hubble.net 的数据库和数据表时,Hubble.net 将自动和对应的关系数据库实体进行关联,从用户侧看,Hubble.net就像一个数据库实体。

Hubble.net 负责建立文本字段的倒排索引和Untokenized字段的单值索引。关系数据库负责建立B+树索引。这些索引如何协调工作将在本章的后续小节中详细介绍。

 

数据表的种类

主动更新数据表 (Active Table)

Active Table 的特点是通过 hubble.net 更新索引时会同步更新数据库中对应的数据表,对hubble.net 的 active table 进行创建,删除,截断等操作时,hubble.net 也会联动的创建,删除,截断数据库中对应的表。Active table 一般用于实时性要求非常高的应用中,索引和数据可以实施更新。

Active Table 在建表语句中体现为 IndexOnly 属性为 False.

 

image

 

如上图所示,这是一个典型的主动更新数据表的数据流图。

创建,删除,增删改等SQL 语句由 Hubble.SQLClient 发起,到达Hubble.Core,Hubble.Core 首先更新对应的关系数据库中的表,然后更新Hubble.net的全文索引。从这个数据流图我们可以看出,关系数据库和全文索引是同步更新的,这样就保证了数据的实时性。

 

被动更新数据表 (Passive Table)

Active table 有着实时性强的优点,但在对现有数据库应用系统构建全文索引时,往往我们希望直接在现有数据表的数据基础上实现全文索引功能,而不是通过 Hubble.net 来创建一个新的数据表,这是我们就不能采用 Active Table 而必须才行 Passive Table 来构建全文索引。

Passive Table 在建表语句中体现为 IndexOnly 属性为 True.

 

image

 

上图是一个典型的被动更新数据表的数据流图。

关系数据库的数据更新后,hubble.net 并不会立即更新索引,需要通过 QueryAnalyzer 或者第三方的程序 (后续版本中,hubble.net 的服务端将集成一个简单的哦自动更新模块) 读取关系数据库中对应表的变化信息,然后将变化信息转变为 insert  , update 或者 delete 这样的SQL 语句发送给 Hubble.Core ,Hubble.Core 构建相应的全文索引。

全文数据检索的数据流

 

image

 

上图为hubble.net 全文数据检索(即执行 Select 语句)的数据流图。检索指令从 SQLCLient 发送到Hubble.Core 后,Hubble.Core 将先进行查询优化,将查询语句进行分解并分析,根据分析结果分别到全文索引,单值索引或者关系数据库中进行检索并将检索得到的结果汇总到Hubble.Core 中,根据排序字段排序然后输出给SQLClient。

这个检索流程对应主动和被动方式的数据表都是相同的。

 

数据表的属性

IndexOnly

这个属性指明数据表是主动更新模式还是被动更新模式。

 

Directory

这个属性指明表的全文索引建立到那个目录下

 

DBTableName

这个属性指明关系数据库中对应表的名称

 

DBAdapter

这个属性指明采用哪种数据库适配器访问关系数据库

 

DBConnect

这个属性指明访问关系数据库的连接字符串

 

DocId

这个属性只有 Passive Table 才有,可以指定关系数据库中对应数据表里面某个字段为Hubble.net 的 DocId 字段。

 

这些属性具体如何在建表语句中表述,我将在建表一节详细说明。

 

返回 Hubble.net 技术详解