全文索引支持的数据类型包括CHAR, VARCHAR, NCHAR, NVARCHAR,TEXT, NTEXT, IMAGE, XML, and VARBINARY(MAX)
首先创建一张表:
CREATE TABLE [dbo].[Docs](
[Id] [int] IDENTITY(1,1) NOT NULL Primary Key,
[Title] [varchar](200) NULL,
[Content] [varchar](3000) NULL, --对该列进行全文搜索
[createdate] [datetime] NULL Default Getdate()
)
然后自己插入一下数据进去...
一:配置全文搜索列,如下图:
这里选择需要全文搜索的列,和语言(我这里选择的是简体中文),接下来可以设置默认。
二:实现全文搜索
Select * From Docs With(Nolock) Where Contains(Content,'考试')
同义词
如果我们想查询 "测试" 也同样能查询出 “考试” 的结果,这时候我们就可以设置同义词了。
同义词目录:
MSSQL10_50.MSSQLSERVER\MSSQL\FTDATA\ (在你电脑SQL Server安装目录下)
里面有很多xml文件,找到tschs.xml,因为这个文件是对应中文,不同语言对应不同文件,修改如下:
<XML ID="Microsoft Search Thesaurus">
<thesaurus xmlns="x-schema:tsSchema.xml">
<diacritics_sensitive>0</diacritics_sensitive>
<expansion>
<sub>考试</sub>
<sub>测试</sub>
</expansion>
</thesaurus>
</XML>
这是 考试和 测试就表示的是同一个意思。
执行语句:
exec sys.sp_fulltext_load_thesaurus_file 2052 --2052表示中文(修改完文件之后都要执行下这条语句才能生效)
SELECT * FROM sys.fulltext_languages --查看各语言对应的ID值
SELECT * FROM [Docs] WHERE CONTAINS(CONTENT,'FORMSOF(THESAURUS,考试)')
SELECT * FROM [Docs] WHERE CONTAINS(CONTENT,'FORMSOF(THESAURUS,测试)')
这样上面两条语句返回结果一样(使用关键字FORMSOF)
同义词替换
<XML ID="Microsoft Search Thesaurus">
<thesaurus xmlns="x-schema:tsSchema.xml">
<diacritics_sensitive>0</diacritics_sensitive>
<replacement>
<pat>检测</pat>
<sub>成绩</sub>
<sub>考试</sub>
</replacement>
</thesaurus>
</XML>
这时候查询
检测就等同于查询
成绩或
考试,不会查询检测
断字符
全文搜索列会自动断字,断成若干个有意义的词,比如:
SELECT * FROM sys.dm_fts_parser(N'考试的时候还在发烧', 2052, 0, 1);
这时候我们看到这句话被断字成很多有意义的词了,所以我们查询 考试可以查询到结果,但是我们如果查询 试的,则不会查询到结果,不信你可以试试
干扰词
有些干扰词(noise words)无益于查询,所以需要屏蔽某些词,查看干扰词:
Select * From sys.fulltext_system_stopwords
三:FREETEXT
先来个例子:
SELECT * FROM [Docs] WHERE FREETEXT (CONTENT,'我们去考试吧')
虽然我们表内没有
我们去考试吧这句话,但是依然可以查询出结果,因为这句话里包含
考试。
FREETEXT查询的范围更加广泛,不精准。