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.视图概念 视图是一个虚拟表, ...
随机推荐
- 【转载】CentOS6.5升级手动安装GCC4.8.2
一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...
- 表连接sql执行计划学习
循环嵌套连接(Nested Loop Join) 合并连接(Merge Join) 哈西匹配(Hash Join) 文章:浅谈SQL Server中的三种物理连接操作 循环嵌套,如果内循环列上有索引, ...
- 亲历dataguard的一些经验问答题
问题1:是否log_archive_dest_n=service中进程使用lgwr时(如log_archive_dest_2='service=DBSTD LGWR SYNC'),备库就一定要建立st ...
- Error:Uninitialized object exists on backward branch 70 Exception Details:
网上下载了一个demo,编译出现如下错误: Gradle sync failed: Uninitialized object exists on backward branch 70 Exceptio ...
- mysql获取行号的方法
1.不排序 语句: ) ) ) b,bigquestion 结果: 2.排序的 语句 ) ) ) b,bigquestion order by bigquestion.bigQuestionSequ ...
- C++,C程序设计入门——《高质量程序设计第4章》
1. 连接规范 1. extern “C” 2. 一部分采用C的连接规范 #ifdef __cplusplus extern "C" { #endif #ifdef __cplus ...
- iOS present出一个背景为半透明的试图
WDKChatRoomViewController *roomVC = [[WDKChatRoomViewController alloc] init]; roomVC.titleStr = [gro ...
- HDU 1896 【留个使用priority_queue容器的样例】
感谢<啊哈!算法>的讲解,水鸟弄懂了什么是优先队列. 题意是:在路上有很多石子,给出他们的初始位置和小明能够将他们扔出的距离,当小明遇到奇数个石子的时候就会把它扔出,遇到偶数个就会忽略他, ...
- ABP每次生成前都执行bundle设置
ABP项目每次编译mvc项目时都会执行bundle,比较耗时. 可以在项目文件(*.csproj)中发现设置了每前生成前执行的命令 <Target Name="PreBuild&quo ...
- Myeclipse配置jad
下载地址:http://pan.baidu.com/s/1bnpMEuF 1.下载jad158g.win.zip 下载后解压.解压缩后将jad.exe拷贝到自定义的文件夹内:我这里用的是D:/jad/ ...