设为首页 收藏本站
查看: 1438|回复: 0

[经验分享] 全文索引原理和一个完整的SQL SERVER数据库全文索引的示例(转)

[复制链接]

尚未签到

发表于 2015-7-2 09:27:14 | 显示全部楼层 |阅读模式
  全文检索是对大数据文本进行索引,在建立的索引中对要查找的单词进行进行搜索,定位哪些文本数据包括要搜索的单词。因此,全文检索的全部工作就是建立索引和在索引中搜索定位,所有的工作都是围绕这两个来进行的。下面就逐个介绍。
  建立全文索引中有两项非常重要,一个是如何对文本进行分词,一是建立索引的数据结构。分词的方法基本上是二元分词法、最大匹配法和统计方法。索引的数据结构基本上采用倒排索引的结构。
  分词的好坏关系到查询的准确程度和生成的索引的大小。在中文分词发展中,早期经常使用分词方式是二元分词法,该方法的基本原理是将包含中文的句子进行二元分割,不考虑单词含义,只对二元单词进行索引。因此该方法所分出的单词数量较多,从而产生的索引数量巨大,查询中会将无用的数据检索出来,好处是算法简单不会漏掉检索的数据。之后又发展出最大匹配分词方法,该方法又分为正向最大分词和逆向最大分词。其原理和查字典类似,对常用单词生成一个词典,分析句子的过程中最大的匹配字典中的单词,从而将句子拆分为有意义的单词链。最大匹配法中正向分词方法对偏正式词语的分辨容易产生错误,比如“首饰和服装”会将“和服”作为单词分出。达梦数据库采用的是改进的逆向最大分词方法,该分词方法较正向正确率有所提高。最为复杂的是通过统计方式进行分词的方法。该方法采用隐式马尔科夫链,也就是后一个单词出现的概率依靠于前一个单词出现的概率,最后统计所有单词出现的概率的最大为分词的依据。这个方法对新名词和地名的识别要远远高于最大匹配法,准确度随着取样文本的数量的增大而提高。
  二元分词方法和统计方法是不依赖于词典的,而最大匹配法分词方法是依赖于词典的,词典的内容决定分词结构的好坏。
  全文检索的索引被称为倒排索引,之所以成为倒排索引,是因为将每一个单词作为索引项,根据该索引项查找包含该单词的文本。因此,索引都是单词和唯一记录文本的标示是一对多的关系。将索引单词排序,根据排序后的单词定位包含该单词的文本。
  
逆向分词的过程说明
  步骤1)读取一整条句子到变量str中,转到步骤2
  步骤2)从句子的尾端读取1个字到变量word中,转到步骤3
  步骤3)在字典查找word中保存的单词。如果存在则保存word,转到步骤4,否则转到步骤5)
  步骤4)如果是字典中最大单词或者超过最大单词数(认定为新词),从句尾去掉该单词,返回步骤2
  步骤5)读取前一个字到word中,构成新单词,转到步骤3)
  词库的内存数据结构和词库中单词的匹配算法
    内存中单词采用层次结构保存
  假设字典中有如下的单词:中国  中华民国 国家 人民 民主
  在内存中按照如下方式按层排列,其中每一个方块代表一个字,箭头所指向为该单词的前一个字。

单词按照如下方式匹配

  比如查找单词“中华民国”

  首先在第一层中使用二分法找到“国”字

  获得“国”下层的数组“中民”

  在该层使用二分法查找“民”,获得“民”下层的数组“华”

  在该层使用二分法查找“华”,获得“华”下层的数组“中”

  最后在该层找到中,至此,但此匹配完毕。

  索引的格式
  索引的格式是倒排索引的格式,也就是一个单词对应若干个文本表示。

  在达梦数据库中,建立全文索引的对象是rec中的字段,生成倒排索引使用数据库中的b树进行存储。

  在数据库是对某个字符字段进行全文索引,因此,rec的rowid作为该rec上该field的标示是必须要被记录的。

  因此倒排索引存储的格式如下。

字段1字段2
单词1Rowid1,rowid2…
单词1Rowid1,rowid2…
……

由于b树的字段长度是有限的,因此b树存储的格式为

字段1字段2字段3
单词1单词1Rowid的格数Rowid1,rowid2…
单词1单词2Rowid的格数Rowid1,rowid2…
………

全文索引的查询

  全文的索引查询首先将对要查询的单词进行分词,然后在存储倒排索引的b树中将包含这些单词的rowid全部查找出来,并根据这些rowid在存储实际数据的b树中,将包含这些数据的行过滤出来。

  一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例)首先,介绍利用系
   1) 启动数据库的全文处理功能 (sp_fulltext_database)
   2) 建立全文目录 (sp_fulltext_catalog)
   3) 在全文目录中注册需要全文索引的表 (sp_fulltext_table)
   4) 指出表中需要全文索引的列名 (sp_fulltext_column)
   5) 为表创建全文索引 (sp_fulltext_table)
   6) 填充全文目录 (sp_fulltext_catalog)
   ---------********示例********-------------
  以对pubs数据库的title和notes列建立全文索引,之后使用索引查询title列或notes列中
包含有datebase 或computer字符串的图书名称:在这之前,需要安装Microsoft Search服务
   user pubs --打开数据库
   go
   --检查数据库pubs是否支持全文索引,如果不支持
   --则使用sp_fulltext_database 打开该功能
   if(select databaseproperty('pubs','isfulltextenabled'))=0
   execute sp_fulltext_database 'enable'--建立全文目录FT_PUBS
   execute sp_fulltext_catalog 'FT_pubs','create'--为title表建立全文索引数据元
   execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'--设置
   execute sp_fulltext_column 'title','title','add'
  execute sp_fulltext_column 'title','notes','add'--建立全文索引
   --activate,是激活表的全文检索能力,也就是在全文目录中注册该表
   execute sp_fulltext_table 'title','activate'--填充全文索引目录
   execute sp_fulltext_catalog 'FT_pubs','start_full'
   go--检查全文目录填充情况   While fulltextcatalogproperty('FT_pubs','populateStatus')0
   begin--如果全文目录正处于填充状态,则等待30秒后再检测一次
   waitfor delay '0:0:30'
   end--全文目录填充完成后,即可使用全文目录检索select title
   form
   where CONTAINS(title,'database')
   or CONTAINS(title,'computer')
   or CONTAINS(notes,'database')
   or CONTAINS(notes,'database')
   '--------------以下介绍一下全文操作类的系统存储过程
   过程名称:sp_fulltext_service
   执行权限:serveradmin或系统管理员
   作 用:设置全文搜索属性
   过程名称:sp_fulltext_catalog
   执行权限:db_owner及更高角色成员
   作 用:创建和删除一个全文目录,启动或停止一个全文目录的索引操作
   过程名称:sp_fulltext_database
   执行权限:db_owner角色成员
   作 用:初始化全文索引或删除数据库中所有全文目录
   过程名称:sp_fulltext_table
   执行权限:db_ddladnmin或db_owner角色成员
   作 用:将一个表标识为全文索引表或非全文索引表
   过程名称:sp_fulltext_column
   执行权限:db_ddladnmin角色成员
   作 用:指出一个全文索引表中的那些列假如或退出全文索引

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82439-1-1.html 上篇帖子: 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 下篇帖子: 如何实现远程连接SQL Server 2008 Express
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表