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 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene ...
- HubbleDotNet开源全文搜索数据库项目--查询方法汇总 ——eaglet
HubbleDotNet 的查询语法为类 SQL 语句,本文以示例的形式讲述HubbleDotNet 的各种查询方法.随着功能不断的增加,查询方法还会不断补充. 本文给出如下查询方法的示例: 对单个字 ...
- hubbledotnet mysql_HubbleDotNet开源全文搜索数据库项目--查询方法汇总
HubbleDotNet 的查询语法为类 SQL 语句,本文以示例的形式讲述HubbleDotNet 的各种查询方法.随着功能不断的增加,查询方法还会不断补充. 本文给出如下查询方法的示例: 对单个字 ...
- 开源全文搜索(搜索引擎)
吃水不忘挖井人,介绍Doug Cutting大牛是十分有必要的. 最早,接触到搜索引擎,知道有个Nutch(开源搜索引擎),于是开始查看Nutch相关的资料,发现了Nutch的创始人Doug Cutt ...
- 谷歌小姐姐开源姿势动画师项目,组合现有TF模型,只需一张SVG图片便可配置...
梅宁航 发自 凹非寺 量子位 报道 | 公众号 QbitAI 姿势动画师,自己做动作就可以生成矢量角色动画. 打开摄像头,你的姿态随之摇摆,一道道线.一个个点,刻画你的面部轮廓和完美身材. △效果图 ...
- 玩转MYSQL(2) 数据库的约束、聚合查询、联合查询以及三种表的设计
目录标题 一.MYSQL的那些约束你掌握了几种? 二.表与表之间的三种关系 三.查询 3.1 :聚合查询 3.2.GROUP BY 3.3.HAVING和group by 搭配使用 3.4.联合查询 ...
- 如何使用Visual Studio创建SQL Server数据库项目
目录 背景 介绍 创建新的SQL Server数据库项目 发布以在SQL Server中创建新数据库 结论 背景 数据库在任何应用程序中都扮演着最重要的角色,当表.视图.存储过程的数量增加时,项目管理 ...
- Haystack全文搜索
Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...
- python elasticsearch 入门教程(二) ---全文搜索
python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...
最新文章
- Linux下利用rsync实现多服务器文件同步
- Unknown column 'subject_1.pid' in 'field list') [SQL: 'SELECT anon_1.screen_id AS anon_1_screen_i
- python资料免费-MicroPython最全资料免费获取
- 可心耳语-属于网络工程师的人声电台(第一期)
- html画布显示PPT,【Web前端问题】有没有办法让HTML5 canvas显示/预览word/excel/powerpoint 文档?...
- easyui datagrid 列拖动
- rabbitmq-路由模式-routingkey
- 用事件驱动编程解救臃肿的代码
- 测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
- Java程序员必须掌握的Spring依赖管理原理
- Vue-Router学习笔记-(黑马视频)
- MySQL练习题及答案(图书管理数据库)
- Redis集群:./redis-trib.rb:24:in `require': no such file to load -- rubygems
- MotoSimEG-VRC软件:安川机器人摆动焊接虚拟仿真操作方法
- Java EJB到底是什么?
- HTTP协议详解+经典面试题
- 规范化:范式(主属性,非主属性,1NF,2NF,3NF,BCNF:定义,例子等)
- 企业微信根据微信联系人批量自动发送邀请,还可根据手机号批量添加
- Slurm作业启动原理
- Houdini vop