首页 技术 正文
技术 2022年11月21日
0 收藏 302 点赞 2,938 浏览 3445 个字

关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表

来解决多表关联时的全文索引问题。

下面以 为数据库现有表建立全文索引(二) Updatable 模式 这篇文章中的 EnglishNews 表为例,来说明如果对多表关联的情况建全文索引

EnglishNews 有两个关联表,分别是 NewsGroup 和 SiteGroup ,他们分别以GroupId 和 SiteId 字段和EnglishNews 表中同名字段关联。

如下图所示

HubbleDotNet 开源全文搜索数据库项目–为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

为了能对多表关联的情况建索引,我们需要先在数据库中创建一个视图,将需要索引的字段整合到这个视图中来

创建视图语句:

Create view VEnglishNews 
as
select Id as DocId, EnglishNews.GroupId, NewsGroup as GroupTitle, 
EnglishNews.SiteId, Site, Title, Content, 
Title + ' ' + Content + ' ' + NewsGroup + ' ' + Site as SearchContent, 
Time, URL, ImageUrl from EnglishNews, NewsGroup, SiteGroup 
where EnglishNews.GroupId = NewsGroup.GroupId and 
EnglishNews.SiteId = SiteGroup.SiteId

这里我们为这个视图创建一个 AppendOnly 模式的索引表,因为是AppendOnly 模式,所以我们将 Id 字段的名字转换为 DocId。

如果要创建 Updatable 模式索引表,则视图中不要将 Id 字段转换为 DocId.

多表关联的约束条件

HubbleDotNet 支持通过视图方式来对多表关联进行全文索引,但并不是任意视图都可以做全文索引,我们必须保证视图中用作Id的字段

在视图中是唯一性约束字段,也就是说,视图中这个Id字段不能重复。这里需要说明的是,即使Id字段在其对应的表中是不重复的也不能

保证在视图中肯定不重复,比如NewsGroup表中如果有两条记录的GroupId 字段的值相同,那么在视图中就会出现两个Id字段重复的记录,

这种情况下就不能对视图进行全文索引,因为HubbleDotNet 找不到一个唯一性字段来获取最终的数据记录。所以为了保证视图可以被全文

索引,视图中各个表的关联字段必须一一对应,以这个例子来说,EnglishNews 表中每条记录在NewsGroup 和 SiteGroup 表中都只能有

唯一的记录与其对应才行,不可以出现一对多的情况。对于一对多的情况,后续版本将通过交叉关联查询来解决。

通过视图创建表还有一个好处就是可以逻辑分割索引,比如我们有一个大表存在1亿行记录,如果对这1亿行记录建立一个大的索引,那么索引

文件会非常大,查询效率也不高,我们希望把这1亿行记录分为10段,分别进行全文索引,然后用 UnionSelect 方法对这10个小的索引表联合

查询(联合查询是并行计算,对于多核的服务器,联合查询的速度要远远快于查询单表),后续版本我们还可以对这些小的索引表进行分布式查询。

如果不用视图,我们必须在物理上建10个表,分别对这10个表建索引,但如果利用了视图,则问题就变的简单了,我们只要对一个物理表建10个

视图,这10个视图通过 where 语句对返回记录进行分段就可以了,维护起来非常方便。

下面我们还是来看视图建好后,如何构建全文索引,构建全文索引的过程和 为数据库现有表或视图建立全文索引(一) Append Only 模式 这篇

文章是类似的,下面我简单说明一下。

在点击 Create Table 菜单后,输入HubbleDotNet的索引表名,这里输入VEnglishNews,这个表名不一定要和视图名相同。

其他参数和 为数据库现有表或视图建立全文索引(一) Append Only 模式 的例子相同,这里不详述。

HubbleDotNet 开源全文搜索数据库项目–为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

如上图,接下来设置索引模式,这里与为数据库现有表或视图建立全文索引(一) Append Only 模式 不同的是 Exit Table Name or View Name 中

我们填入的是视图名而不是表名。

HubbleDotNet 开源全文搜索数据库项目–为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

如上图,接下来设置字段,我们发现视图中所有字段都被自动列了出来,我们对这些字段分别设置索引类型就可以了。

接下来给出了建表语句

[IndexOnly]
[Directory ('d:\test11\VEnglishNews\')]
[DBTableName ('VEnglishNews')]
[DBAdapter ('SQLSERVER2005')]
[DBConnect ('Data Source=(local);Initial Catalog=Test;Integrated Security=True')]
Create table VEnglishNews
(
GroupId Int Untokenized NULL default 0 ,
GroupTitle NVarchar(max) Tokenized Analyzer 'EnglishAnalyzer' NULL default '' ,
SiteId Int Untokenized NULL default 0 ,
Site NVarchar(max) Tokenized Analyzer 'EnglishAnalyzer' NULL default '' ,
Title NVarchar(max) Tokenized Analyzer 'EnglishAnalyzer' NULL default '' ,
Content NVarchar(max) Tokenized Analyzer 'EnglishAnalyzer' NULL default '' ,
SearchContent NVarchar(max) Tokenized Analyzer 'EnglishAnalyzer' NULL default '' ,
Time DateTime Untokenized NULL default '1900-1-1' ,
URL NVarchar(max) NULL ,
ImageUrl NVarchar(max) NULL 
);

图和 AppendOnly 那篇文章相同,我就不给出了,点Finish 后完成索引。

后面就是索引和优化,方法和 为数据库现有表或视图建立全文索引(一) Append Only 模式 一文的方法相同,这里不重述。

索引同步

AppendOnly 模式对视图建索引,由于只是增加记录,其同步方法和 AppendOnly 模式下表的同步方法是相同的。详见 自动和现有表同步

Updatable 模式下对视图建索引,同步就比较麻烦,我们可以为每个子表都设置触发器,触发器最后要操作相同的辅助触发表,这个需要开发者多动一些脑筋。

如果不采用自动同步,我们还可以通过程序半自动同步索引,详见 通过程序和现有表或视图同步 。

如果记录不是太多,比如只是百万行级别,而且实时性要求不高,我们还可以采用通过双表互动方式来做,就是设置两个同结构表,一个表负责查询,

一个表负责索引,数据更新后,负责索引的表定时 Rebuild 所有记录,Rebuild 完后,负责索引的表切换成负责查询的表,负责查询的表切换为负责索引的表,

这样交互运行。HubbleDotNet 的后续版本将为这种方式提供比较简便的封装,而且可以进行多机负荷分担。

示例:

示例1.
select top 10 Title, GroupTitle, Site, Time, Score from VEnglishNews where
Title match 'tax assessor' and GroupTitle contains 'USA' order by score desc
 
查询视图中 Title 字段包括 tax 和 assessor 这两个词中任意一个词的记录并且 GroupTitle 为 USA 的所有记录,
并按匹配相关度从大到小排序。

HubbleDotNet 开源全文搜索数据库项目–为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

示例2.

select top 10 Title, Content, GroupTitle, Site, Time, Score from VEnglishNews where
SearchContent contains 'tax assessor USA' order by score desc

查询视图中 所有全文字段同时包括 tax ,assessor 和 USA  这两个词中任意一个词的记录,并按匹配相关度从大到小排序。

这里我们可以看到,查询的字段 SearchCoutent 在视图中实际上是多个全文字段的合并。这种查询方式适合于只有一个搜索框时对表中

所有全文字段进行搜索。

HubbleDotNet 开源全文搜索数据库项目–为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,816
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,899