关系型数据库中,多表关联是很常见的事情,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 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式...相关推荐

  1. HubbleDotNet开源全文搜索数据库项目--技术详解

    HubbleDotNet开源全文搜索数据库项目--技术详解 HubbleDotNet 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene ...

  2. HubbleDotNet开源全文搜索数据库项目--查询方法汇总 ——eaglet

    HubbleDotNet 的查询语法为类 SQL 语句,本文以示例的形式讲述HubbleDotNet 的各种查询方法.随着功能不断的增加,查询方法还会不断补充. 本文给出如下查询方法的示例: 对单个字 ...

  3. hubbledotnet mysql_HubbleDotNet开源全文搜索数据库项目--查询方法汇总

    HubbleDotNet 的查询语法为类 SQL 语句,本文以示例的形式讲述HubbleDotNet 的各种查询方法.随着功能不断的增加,查询方法还会不断补充. 本文给出如下查询方法的示例: 对单个字 ...

  4. 开源全文搜索(搜索引擎)

    吃水不忘挖井人,介绍Doug Cutting大牛是十分有必要的. 最早,接触到搜索引擎,知道有个Nutch(开源搜索引擎),于是开始查看Nutch相关的资料,发现了Nutch的创始人Doug Cutt ...

  5. 谷歌小姐姐开源姿势动画师项目,组合现有TF模型,只需一张SVG图片便可配置...

    梅宁航 发自 凹非寺  量子位 报道 | 公众号 QbitAI 姿势动画师,自己做动作就可以生成矢量角色动画. 打开摄像头,你的姿态随之摇摆,一道道线.一个个点,刻画你的面部轮廓和完美身材. △效果图 ...

  6. 玩转MYSQL(2) 数据库的约束、聚合查询、联合查询以及三种表的设计

    目录标题 一.MYSQL的那些约束你掌握了几种? 二.表与表之间的三种关系 三.查询 3.1 :聚合查询 3.2.GROUP BY 3.3.HAVING和group by 搭配使用 3.4.联合查询 ...

  7. 如何使用Visual Studio创建SQL Server数据库项目

    目录 背景 介绍 创建新的SQL Server数据库项目 发布以在SQL Server中创建新数据库 结论 背景 数据库在任何应用程序中都扮演着最重要的角色,当表.视图.存储过程的数量增加时,项目管理 ...

  8. Haystack全文搜索

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

  9. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

最新文章

  1. Linux下利用rsync实现多服务器文件同步
  2. Unknown column 'subject_1.pid' in 'field list') [SQL: 'SELECT anon_1.screen_id AS anon_1_screen_i
  3. python资料免费-MicroPython最全资料免费获取
  4. 可心耳语-属于网络工程师的人声电台(第一期)
  5. html画布显示PPT,【Web前端问题】有没有办法让HTML5 canvas显示/预览word/excel/powerpoint 文档?...
  6. easyui datagrid 列拖动
  7. rabbitmq-路由模式-routingkey
  8. 用事件驱动编程解救臃肿的代码
  9. 测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
  10. Java程序员必须掌握的Spring依赖管理原理
  11. Vue-Router学习笔记-(黑马视频)
  12. MySQL练习题及答案(图书管理数据库)
  13. Redis集群:./redis-trib.rb:24:in `require': no such file to load -- rubygems
  14. MotoSimEG-VRC软件:安川机器人摆动焊接虚拟仿真操作方法
  15. Java EJB到底是什么?
  16. HTTP协议详解+经典面试题
  17. 规范化:范式(主属性,非主属性,1NF,2NF,3NF,BCNF:定义,例子等)
  18. 企业微信根据微信联系人批量自动发送邀请,还可根据手机号批量添加
  19. Slurm作业启动原理
  20. Houdini vop

热门文章

  1. IccFileHandler和IccRecords
  2. oracle reverse 反转函数
  3. beego mysql session_关于go中beego/session的小总结
  4. 设计模式 — 行为型模式 — 访问者模式
  5. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作
  6. Powershell指令集_1
  7. Python入门(三)变量类型及数据类型转换
  8. 同步 异步 阻塞 非阻塞概念区分
  9. 记一次接收微信公众平台推送消息的实例
  10. Python读取PDF内容