HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式
关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表
来解决多表关联时的全文索引问题。
下面以 为数据库现有表建立全文索引(二) Updatable 模式 这篇文章中的 EnglishNews 表为例,来说明如果对多表关联的情况建全文索引
EnglishNews 有两个关联表,分别是 NewsGroup 和 SiteGroup ,他们分别以GroupId 和 SiteId 字段和EnglishNews 表中同名字段关联。
如下图所示
![]()
为了能对多表关联的情况建索引,我们需要先在数据库中创建一个视图,将需要索引的字段整合到这个视图中来
创建视图语句:
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 模式 的例子相同,这里不详述。
![]()
如上图,接下来设置索引模式,这里与为数据库现有表或视图建立全文索引(一) Append Only 模式 不同的是 Exit Table Name or View Name 中
我们填入的是视图名而不是表名。
![]()
如上图,接下来设置字段,我们发现视图中所有字段都被自动列了出来,我们对这些字段分别设置索引类型就可以了。
接下来给出了建表语句
[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 的所有记录,
并按匹配相关度从大到小排序。
![]()
示例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 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式的更多相关文章
- HubbleDotNet开源全文搜索数据库项目--技术详解
HubbleDotNet 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene.Net 匹配相关度的比较 HubbleDotNet 软件架 ...
- HubbleDotNet开源全文搜索组件相关资源
系统简介 HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使 ...
- 表视图控制器(TableViewController)(三) 、 表视图搜索
1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定 ...
- Flask学习之十 全文搜索
英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search 中文翻译地址:http://ww ...
- 如何在MySQL中获得更好的全文搜索结果
如何在MySQL中获得更好的全文搜索结果 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语 ...
- 1. 全文搜索框架 Haystack
1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...
- Elasticsearch全文搜索——adout
现在尝试下稍微高级点儿的全文搜索——一项传统数据库确实很难搞定的任务. 搜索下所有喜欢攀岩(rock climbing)的雇员: curl -XGET 'localhost:9200/megacorp ...
- laravel-elasticsearch 全文搜索设置
1.首先安装 jave环境 jdk 下载地址 ,我用的是最新版本的,有时版本要跟elasticsearch对应 2.安装elasticsearch 下载地址 3.安装Laravel scout 全文搜 ...
- 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...
随机推荐
- jquery怎么获得ul中li的个数
- xtu summer individual 4 C - Dancing Lessons
Dancing Lessons Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- laravel 文件删除
删除文件 <?php class demo{ public function del(){ $disk = Storage::disk('public');//获取磁盘实例 $disk-> ...
- Halloween Costumes(区间DP)
Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he is planning t ...
- NYOJ90-整数划分,经典递归思想~~
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk, 其中n1≥n2≥-≥nk≥1,k≥1. 正整数 ...
- 安装Android SDK(东软开源镜像介绍)
启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...
- 51nod 1499 (最小割)
题意 分析 将一些点分成两个集合,很明显的最小割问题 设一个S.T,和S相连的点表示在B集合中,和T相连的点表示在A集合中 因为原题是完美值最大,我们转换一下,变成损失的价值最小,那么就是最小割问题了 ...
- css三大布局
标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...
- <项目><day12>通讯录(视频)
1 需求分析(需求分析师) 功能分析: 1)添加联系人 2)修改联系人 3)删除联系人 4)查询所有联系人 2 需求设计(系统分析师/架构师/资深开发人员) 2.1设计实体(抽象实体) 联系人实体: ...
- Eclipse移植项目时JDK版本不匹配Project facet Java version 1.7 is not supported
Eclipse移植项目时JDK版本不匹配Project facet Java version 1.7 is not supported 如果原有项目用的为JDK1.7,而自己的是低版本JDK,比如1. ...