关系型数据库中,多表关联是很常见的事情,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 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene.Net 匹配相关度的比较 HubbleDotNet 软件架 ...

  2. HubbleDotNet开源全文搜索组件相关资源

    系统简介 HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使 ...

  3. 表视图控制器(TableViewController)(三) 、 表视图搜索

    1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定 ...

  4. Flask学习之十 全文搜索

    英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search 中文翻译地址:http://ww ...

  5. 如何在MySQL中获得更好的全文搜索结果

    如何在MySQL中获得更好的全文搜索结果 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语 ...

  6. 1. 全文搜索框架 Haystack

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

  7. Elasticsearch全文搜索——adout

    现在尝试下稍微高级点儿的全文搜索——一项传统数据库确实很难搞定的任务. 搜索下所有喜欢攀岩(rock climbing)的雇员: curl -XGET 'localhost:9200/megacorp ...

  8. laravel-elasticsearch 全文搜索设置

    1.首先安装 jave环境 jdk 下载地址 ,我用的是最新版本的,有时版本要跟elasticsearch对应 2.安装elasticsearch 下载地址 3.安装Laravel scout 全文搜 ...

  9. 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

    数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...

随机推荐

  1. Web前端静态页面示例

    目录结构: Web25\ |—css\ reset.css.common.css.index.css.login.css.reg.css |—js\ jquery-3.3.1.js.index.js. ...

  2. Go map基础

    package main import "fmt" //Map //创建:make(map[string]int) //获取元素: m[key] //key不存在时,获得value ...

  3. 在oracle下我们如何正确的执行数据库恢复

    标签:oracle 数据库 恢复 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jiujian.blog.51cto.com/4 ...

  4. memcached 笔记之windows 7 下面 安装memcached 报错

    windows 7 下面 安装memcached 报错 两种情况: 一:服务确实已经安装过 .如需要重新安装,当然是先memcached.exe -d uninstall 二:奇怪的是服务确实没有安装 ...

  5. MySQL基础架构

    前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询, ...

  6. java 读取数据库数据转化输出XML输出在jsp页面

    因为老师实验报告要求,搭建服务端解析XML 下面代码实现转化XML格式也是在网上找的转化代码 输出在jsp页面以便于客户端解析是自己写的 一个类就解决了Test package tests; //三只 ...

  7. Unity从实践中学习(1)

    首先在实际中unity的开发之中快捷键应该是相当重要的一个部分,这里先引用csdn的一个博客,https://blog.csdn.net/qq_34552886/article/details/697 ...

  8. 检测socket链接是否断开

    [解决方案]   1. 发送重试,由业务完成.     因为club_l5的send接口不会保留用户发送的内容,在recv失败的情况下,用户发送的数据已经丢失,所以只能由业务进行重试.     结论: ...

  9. 数据库中的DDL/DML/DCL解释(转)

    DDL is Data Definition Language statements. Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 1.CREATE - ...

  10. Oracle Spatial中的空间索引

    转自cryolite原文 Oracle Spatial中的空间索引 Oracle Spatial可对空间数据进行R-tree索引,每个空间图层(Spatial Layer)的空间索引元信息都可以在US ...