• 北京公园科普月教您识飞鸟--旅游频道_百家讲坛刘秀 2018-11-26
  • 无证旅行社套路深 低价游、“潜规则”坑骗老年人--旅游频道_汉寿党建网 2018-11-26
  • 上赛道开启蒸蒸日上2018_叶赫那拉宇策 2018-11-26
  • 多名乘客生病 阿联酋一航班在纽约降落后被隔离_沈人杰 2018-11-26
  • 四川绵阳市涪城区工区街道迎宾社区党总支 
    盘活资源,让共建共治有支撑_重生之医门嫡女
    2018-11-26
  • 国家发改委助力民企纾困新表态:只要是好企业 我们就拿钱救_无路可逃by蓝飏 2018-11-26
  • 军事安全遭遇新变局新挑战_雅荡 2018-11-26
  • 青海省:游客在青海旅游被骗1万多 县委迅速协调解决_重生之我是宇智波泉奈 2018-11-26
  • 颠覆2018 悬疑2019_帮忙找一本书【要小说阅读网女生版那里的】 2018-11-26
  • 中国驻英大使馆在伦敦马克思墓前举办缅怀活动_朱炜明 2018-11-26
  • 综述:中马共享21世纪海上丝路新梦想_泰山恩仇 2018-11-26
  • 国庆在线旅游投诉七成都是酒店预订--旅游频道_影儿女装官网 2018-11-26
  • 交通运输部:前三季度高速公路完成投资超7亿_中原证券官网 2018-11-25
  • 涉案金额10.4亿!吕梁市原副市长张中生被判处死刑_何辅堂 2018-11-25
  • 景山学校落户通州!7大名校将为区域加分 _荀攸传 2018-11-25
  • 商务合作,域名招租请联系QQ:959847138
    殷佳心>焦点>正文

    SQL Server 全文搜索功能、全文索引方式介绍

    2019-04-09 14:37:52 IT时代网 [ 数据库 ] 分享

    殷佳心 www.yzcom.cn   SQL Server 的全文(Full-Text Search)是基于分词的文本检索功能,依赖于全文索引。全文索引不同于传统的平衡树(B-Tree)索引和列存储索引,它是由数据表构成的,称作倒转索引(Invert Index),存储分词和行的唯一键的映射关系。倒转索引是在创建全文索引或更新全文索引时,由SQL Server自动创建和维护的。

      全文索引主要包含三种分析器:分词器(word Breaker)、词干分析器(stemmer)和同义词分析器。全文索引中存储的数据是分词及其位置等信息,分词是基于特定语言的语法规则,按照特定的符号寻找词语的边界,把文本分解为“单词”,每一个单词叫做一个分词(term);全文索引有时会提取分词的词干,把词干的多种派生形式存储为单一词干,这个过程叫做提取词干;根据用户提供的自定义同义词列表,把相关的单词转换为同义词,这个过程叫做提取同义词。

      生成全文索引是把用户表中的文本数据进行分词(Word breaker)和提取词干(Stemmer),并转换同义词(Thesaurus),过滤掉分词中的停用词(Stopword),最后把处理之后的数据存储到全文索引中。把数据存储到全文数据的过程叫做填充(Populate)或爬虫(Crawl)进程,全文索引的更新方式可以手动填充,自动填充,或增量填充。

    一、创建全文目录和唯一索引

      创建全文索引之前,必须创建全文目录(Full-Text Catalog),全文目录用于组织全文索引,是全文索引的容器。每一个全文索引必须属于一个全文目录。全文目录是个逻辑结构,跟数据库的架构(Schema)相同,根据全文索引的存储位置无关。?

      为了创建全文索引,基础表上必须存在一个唯一的(unique)、单列的(single-column)、非空的(non-nullable)的索引,全文引擎使用该索引把基础表上的每行数据映射唯一索引键上,倒转索引存储的就是该索引键和分词之间的映射关系。?

    二、创建全文索引

      每个表只能创建一个全文索引,创建全文索引时,必须考虑全文索引存储的文件组,全文索引关联的停用词列表,全文索引的更新方式,以及跟文本关联的语言,全文索引列必须是文本字段,例如:?

    1、语言(language)

      选项 language 是可选的,用于指定列级别的语言,该选项的值可以是语言的名称或LCID,如果没有指定language选项,那么使用SQL Server实例的默认语言。从系统视图 sys.fulltext_languages (Transact-SQL)中查看系统支持的语言及其对应的LCID 和名称。

    2、全文目录(fulltext_catalog)

      选项fulltext_catalog_name 用于指定全文索引的分组,

    3、文件组(filegroup)

      选项 filegroup filegroup_name 用于指定全文索引存储的文件组,如果没有指定文件组,那么全文索引和基础表存储在相同的文件组中。由于更新全文索引是IO密集型操作,因此,为了更快的更新全文索引,最好把全文索引存储在不同于基础表的的物理硬盘或文件组上,以达到最大的IO并发。

    4、填充全文索引的方式

      和普通的索引相同,当基础表数据更新时,全文索引必须自动更新,这是系统默认的行为,也可以配置手动更新全文索引,或者间隔特定的时间点自动更新全文索引。

      选项CHANGE_TRACKING 用于指定跟全文索引列相关的数据更新(Update,Delete,或Insert)是否需要同步到全文索引,

      •CHANGE_TRACKING = MANUAL :手动更新

      •CHANGE_TRACKING =AUTO:自动更新,默认设置,当基础表数据变化时,全文索引自动更新,

      •CHANGE_TRACKING =OFF , NO POPULATION:不更新,指定选项NO POPULATION,表明在创建全文索引之后,SQL Server不会更新(populate)全文索引;如果未指定选项NO POPULATION,在创建全文索引之后,SQL Server更新全文索引。

    5、停用词(STOPLIST)

      停用词(StopWord)也称作噪音词,每一个全文索引都会关联一个停用词列表,默认情况下,全文索引关联的是系统停用词(system stoplist)。全文引擎把停用词从分词中删除,使全文索引不会包含停用词。?

    三、填充全文索引

      填充全文索引也叫做爬虫(crawl)进程,或填充(Population)进程。由于创建或填充全文索引会消耗大量的系统(IO、内存)资源,因此尽量选择在系统空闲时对全文索引进行填充。在创建全文索引时,通过指定选项 CHANGE_TRACKING= MANUAL,或 CHANGE_TRACKING= OFF, NO POPULATION,新建的全文索引不会立即填充,用户可以选择在系统空闲时,使用 alter fulltext index 语句执行填充操作。只有填充全文索引之后,全文索引才包含基础表的分词数据。?

    更新全文索引有三种方式:

      1、FULL POPULATION:全部填充,从基础表中获取每一行,重新编入全文索引;

      2、INCREMENTAL POPULATION:增量填充,前提是基础表中包含timestamp字段,从上一次填充之后,只把更新之后的数据编入全文索引;

      3、UPDATE POPULATION:更新填充,从上一次填充之后执行更新(insert、update、或delete)操作的数据行重新编入索引;

      在创建全文索引时,如果指定CHANGE_TRACKING=AUTO 或 CHANGE_TRACKING= OFF , 那么新建的全文索引会立即开始填充进程。

    四、使用 contains 谓词查询全文索引

      如果想要在查询中使用全文索引,通常使用CONTAINS谓词来调用全文索引,实现比LIKE关键字更复杂的文本匹配查询,而LIKE关键字是模糊匹配,不会调用全文索引。

      例如,利用contains谓词执行单个分词的完全匹配查询:?

      全文查询跟Like相比,速度更快,支持的功能更复杂,使用contains谓词,不仅能够执行分词的完全匹配或分词的前缀匹配查询,还能够执行基于词根的查询,基于自定义同义词的查询,基于距离和顺序的相邻分词查询。但是,和Like 相比,contains谓词不能进行后缀匹配查询。

      contains谓词返回的结果是布尔值,如果全文索引列中包含指定的关键字或查找模式(pattern),返回TRUE;否则,返回FALSE。

      contains谓词支持word查询和短语查询,word是指单个分词,短语(phrase)是由多个word和间隔的空格组成的,对于短语,必须使用双引号,将多个word组成一个短语。

    1、逻辑组合查询

      使用and ,and not, 或 or 逻辑运算符 匹配多个word 或 多个phrase?

    2、前缀查询

      使用contains谓词进行前缀匹配,和like 'prefix%'功能相同,只不过contains谓词使用“*”作为通配符,“*”匹配0,1或多个字符,前缀匹配的写法是:'"prefix*"',全文索引只能执行前缀匹配。?

      3,查询同义词(thesaurus)或词干(stemmer)

      Stemmer(词干),例如,根据语法规程,英语的动词 根据数(单数,复数),人称,时态的不同而存在不同的变化形式,这些单词都是同源的。?

      THESAURUS (同义词),需要导入XML进行配置,SQL Server 提供一个默认的Thesaurus file,是Empty的。如果在Thesaurus file 配置“Author”,“Writer”,“journalist” 是同义词,在使用fulltext index查询时,只要满足任意一个同义词,都匹配成功。?

    4、距离查询

      使用 near 函数,查询匹配相邻分词的数据行,near函数的定义如下,用于需要在查询模式中指定距离查询的查询模式:?

      例如:使用Near 函数指定相邻分词的距离和匹配顺序,near((term1,term2,term3),5)表示任意两个term之间的距离不能超过5, near((term1,term2,term3),5,true),表示任意两个term的距离不能超过5,并且按照 term1,term2,term3的顺序存在于字符串中。?

      对于 near((term1,term2,term3),5,true),term1 和 term5之间最多存在5个term,不包括内部的分词,“term2”,例如:?

      这个查询会匹配下面的文本,注意,内部的分词CC没有计算距离:?

      例如,在原文本中,分词bike和control的最大距离不能超过10,分词bike必须出现在分词control的前面:?

      SQL Server提供的全文功能,比LIKE关键字丰富,具备初级的全文功能,速度快,维护简单,缺点是,全文功能非常有限,在实际的开发中,可以配合开源的全文引擎,例如,Solr,Elasticsearch等来开发功能更强大的全文功能。

    总结

      以上所述是小编给大家介绍的SQL Server 全文功能介绍,希望对大家有所帮助。

    声明:本站部分资源来源于网络,版权归原作者或者来源机构所有,如作者或来源机构不同意本站转载采用,请通知我们,我们将第一时间删除内容。本站刊载文章出于传递更多信息之目的,所刊文章观点仅代表作者本人观点,并不意味着本站赞同作者观点或证实其描述,其原创性及对文章内容的真实性、完整性、及时性本站亦不作任何保证或承诺,请读者仅作参考。
    编辑:
    赖永初 | 武汉助孕公司 | 三亚代怀孕公司 | 天津代怀孕哪里找 | 郑州助孕优 | 南昌代怀孕 | 恒兴烧坊 | IT传奇霸业 | 大话健康网 | 孝感新闻资讯网 | 企鹅保险网 | 嵊州新闻资讯网 | 代生孩子的女人怎么找 | 吉林来孕 |
    商务合作,域名招租请联系QQ:959847138