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)相同,根据全文索引的存储位置无关。

create fulltext catalog catalog_testas default;
create unique index uidx_dbLogID on [dbo].[DatabaseLog]([DatabaseLogID]);

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

create fulltext index on [dbo].[DatabaseLog]([tsql] language 1033)key index ui_dbLogIDon (catalog_test,filegroup [primary]) with(change_tracking=off ,no population ,stoplist=system);

选项 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)。全文引擎把停用词从分词中删除,使全文索引不会包含停用词。

STOPLIST [ = ] { OFF | SYSTEM | stoplist_name } 

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

alter fulltext index on table_namestart { full | incremental | update } population;

•FULL POPULATION:全部填充,从基础表中获取每一行,重新编入全文索引;
•INCREMENTAL POPULATION:增量填充,前提是基础表中包含timestamp字段,从上一次填充之后,只把更新之后的数据编入全文索引;
•UPDATE POPULATION:更新填充,从上一次填充之后执行更新(insert、update、或delete)操作的数据行重新编入索引;

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

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

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

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

select [tsql] from [dbo].[DatabaseLog] where contains([tsql], 'searchword', language 1033);

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

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

1,逻辑组合查询

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

CONTAINS(Name, '"Mountain" OR "Road" ')CONTAINS(Name, ' Mountain OR Road ')

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

CONTAINS(Name, ' "Chain*" ')CONTAINS(Name, '"chain*" OR "full*"')

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

CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')
CONTAINS(Description, ' FORMSOF (THESAURUS, author) ')

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

NEAR ( ( { <simple_term> | <prefix_term> } [ ,…n ] ) [, <maximum_distance> ] [, <match_order> ] ) 
--regardless of the intervening distance and regardless of orderCONTAINS(column_name, 'NEAR(term1,"term3 term4")')--searches for "AA" and "BB", in either order, within a maximum distance of fiveCONTAINS(column_name, 'NEAR((AA,BB),5)')--in the specified order with regardless of the distanceCONTAINS(column_name, 'NEAR ((Monday, Tuesday, Wednesday), MAX, TRUE)')
CONTAINS(column_name, 'NEAR((AA,BB,CC),5)')
BB one two CC three four five AA
CONTAINS(Comments , 'NEAR((bike,control), 10, TRUE)')

总结

更多相关文章

  1. android实现关键字搜索功能
  2. Android(安卓)4.0设计规范 优先导读 十大改变
  3. 【Android】EditText实现搜索功能,把键盘回车键改为搜索;EditText
  4. Android(安卓)软键盘 禁用回车功能或者换成搜索功能
  5. 如何使用android中的搜索功能
  6. Django 博客实现简单的全文搜索
  7. ElasticSearch 全文搜索精确匹配中文短语
  8. 浅谈使用ElasticSearch实现全文检索
  9. 百度静态网站全站搜索功能

随机推荐

  1. 【Android】使用MediaCodec硬编码实现视
  2. android 圆角头像
  3. 380个Android实例
  4. Android安装卸载程序具体操作方法解析
  5. view属性大全
  6. Android 4.1 Jelly Bean 相关资源
  7. Android——媒体库 相关知识总结贴
  8. 【30篇突击 android】源码统计三
  9. Android(安卓)颜色渲染(二) 颜色区域划分
  10. Android软键盘的隐藏显示