2,全文目录(fulltext_catalog)
选项 fulltext_catalog_name 用于指定全文索引的分组,
3,文件组(filegroup)
选项 filegroup filegroup_name 用于指定全文索引存储的文件组,如果没有指定文件组,那么全文索引和基础表存储在相同的文件组中。由于更新全文索引是 IO 密集型操作,因此,为了更快的更新全文索引,最好把全文索引存储在不同于基础表的的物理硬盘或文件组上,以达到最大的 IO 并发。
4,填充全文索引的方式
和普通的索引相同,当基础表数据更新时,全文索引必须自动更新,这是系统默认的行为,也可以配置手动更新全文索引,或者间隔特定的时间点自动更新全文索引。
选项 CHANGE_TRACKING 用于指定跟全文索引列相关的数据更新(Update,Delete,或 Insert)是否需要同步到全文索引,
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_name
- start { full | incremental | update } population;
更新全文索引有三种方式:
在创建全文索引时,如果指定 CHANGE_TRACKING=AUTO 或 CHANGE_TRACKING= OFF , 那么新建的全文索引会立即开始填充进程。
四,使用 contains 谓词查询全文索引
如果想要在查询中使用全文索引,通常使用 CONTAINS 谓词来调用全文索引,实现比 LIKE 关键字更复杂的文本匹配查询,而 LIKE 关键字是模糊匹配,不会调用全文索引。
例如,利用 contains 谓词执行单个分词的完全匹配查询:
- select [tsql]
- from [dbo].[DatabaseLog]
- where contains([tsql], 'searchword', language 1033);
全文查询跟 Like 相比,速度更快,支持的搜索功能更复杂,使用 contains 谓词,不仅能够执行分词的完全匹配或分词的前缀匹配查询,还能够执行基于词根的查询,基于自定义同义词的查询,基于距离和顺序的相邻分词查询。但是,和 Like 相比,contains 谓词不能进行后缀匹配查询。
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 ')
2,前缀查询
使用 contains 谓词进行前缀匹配,和 like 'prefix%'功能相同,只不过 contains 谓词使用 "*" 作为通配符,"*" 匹配 0,1 或多个字符,前缀匹配的写法是:'"prefix*"',全文索引只能执行前缀匹配。
- CONTAINS(Name, ' "Chain*" ')
- CONTAINS(Name, '"chain*" OR "full*"')
3,查询同义词(thesaurus)或词干(stemmer)
Stemmer(词干),例如,根据语法规程,英语的动词 根据数(单数,复数),人称,时态的不同而存在不同的变化形式,这些单词都是同源的。
- CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')
THESAURUS (同义词),需要导入 XML 进行配置,SQL Server 提供一个默认的 Thesaurus file,是 Empty 的。如果在 Thesaurus file 配置 "Author","Writer","journalist" 是同义词,在使用 fulltext index 查询时,只要满足任意一个同义词,都匹配成功。
- CONTAINS(Description, ' FORMSOF (THESAURUS, author) ')
4,距离查询
使用 near 函数,查询匹配相邻分词的数据行,near 函数的定义如下,用于需要在查询模式中指定距离查询的查询模式:
- NEAR ( ( { <simple_term> | <prefix_term> } [ ,…n ] ) [, <maximum_distance> ] [, <match_order> ] )
例如:使用 Near 函数指定相邻分词的距离和匹配顺序,near((term1,term2,term3),5) 表示任意两个 term 之间的距离不能超过 5, near((term1,term2,term3),5,true),表示任意两个 term 的距离不能超过 5,并且按照 term1,term2,term3 的顺序存在于字符串中。
- --regardless of the intervening distance and regardless of order
- CONTAINS(column_name, 'NEAR(term1,"term3 term4")')
- --searches for "AA" and "BB", in either order, within a maximum distance of five
- CONTAINS(column_name, 'NEAR((AA,BB),5)')
- --in the specified order with regardless of the distance
- CONTAINS(column_name, 'NEAR ((Monday, Tuesday, Wednesday), MAX, TRUE)')
对于 near((term1,term2,term3),5,true),term1 和 term5 之间最多存在 5 个 term,不包括内部的搜索分词,"term2",例如:
- CONTAINS(column_name, 'NEAR((AA,BB,CC),5)')
这个查询会匹配下面的文本,注意,内部的搜索分词 CC 没有计算距离:
- BB one two CC three four five AA
例如,在原文本中,分词 bike 和 control 的最大距离不能超过 10,分词 bike 必须出现在分词 control 的前面:
- CONTAINS(Comments, 'NEAR((bike,control), 10, TRUE)')
SQL Server 提供的全文搜索功能,比 LIKE 关键字丰富,具备初级的全文搜索功能,速度快,维护简单,缺点是,全文搜索功能非常有限,在实际的开发中,可以配合开源的全文搜索引擎,例如,Solr,Elasticsearch 等来开发功能更强大的全文搜索功能。参考文档:
CREATE FULLTEXT CATALOG (Transact-SQL)
Get Started with Full-Text Search
Improve the Performance of Full-Text Queries
来源: http://www.cnblogs.com/ljhdo/p/5041605.html