以牺牲空间来换取时间的 sql full-text 具体的实现方案如下所示:
1:在Sql脚本中完成full-text的创建【假设我将Users表中的LoginName字段(nvarchar)与DisplayName字段(nvarchar),Sites表中的Properties字段(xml)加入到full-text文件中】
--检查数据库MyDB是否支持全文索引,如果不支持 --则使用sp_fulltext_database 打开该功能 if(select databaseproperty('MyDB','isfulltextenabled'))=0 execute sp_fulltext_database 'enable' --建立全文目录FT_MyDB(最后的参数e:/fulltext是自定义的存储目录,要是去掉将会在系统默认的地方创建相应的存储文件) execute sp_fulltext_catalog 'FT_MyDB','create','e:/fulltext' --创建唯一索引(这里一定要先将系统默认为主键创建的聚簇索引删除掉,因为一个表中只能有一个聚簇索引) create unique clustered index UsersId on dbo.Users(Id) create unique clustered index SitesId on dbo.Sites(Id) --为Users表和Sites表建立全文索引数据元 execute sp_fulltext_table 'Users','create','FT_MyDB','UsersId' execute sp_fulltext_table 'Sites','create','FT_MyDB','SitesId'
--设置全文索引列名,(Users表的LoginName和DisplayName,Sites表的Properties) execute sp_fulltext_column 'Users','LoginName','add' execute sp_fulltext_column 'Users','DisplayName','add' execute sp_fulltext_column 'Sites','Properties','add' --建立全文索引 --activate,是激活表的全文检索能力,也就是在全文目录中注册该表 execute sp_fulltext_table 'Users','activate' execute sp_fulltext_table 'Sites','activate' --填充全文索引目录 execute sp_fulltext_catalog 'FT_MyDB','start_full' go --检查全文目录填充情况 While fulltextcatalogproperty('FT_MyDB','populateStatus')<>0 begin --如果全文目录正处于填充状态,则等待30秒后再检测一次 waitfor delay '0:0:30' end
2:用相应的语句就可以对设置了全文索引的列进行filter,具体语句如下所示:
SELECT * FROM [MyDB].[dbo].[Users] WHERE CONTAINS(LoginName,'"ad*"') -–获取nvarchar字段LoginName中包含ad的记录 SELECT * FROM [MyDB].[dbo].[Sites] WHERE CONTAINS(Properties,'"haha"') –获取xml字段Properties中包含haha的记录
3:由于sql full-text不能实时与数据库的数据保持一致,因此要为数据表中的Full-Text Index运行相应的Incremental Population 或者 Full Population,这里我们可以通过手动创建一个Schedule机制对其定期执行,使full-text中的数据与数据库中的数据保持一致。
不过这里也可以当我们去查找数据的时候,可执行一下sql 语句来完成Incremental Population的运行,来确保每次搜素出来的数据都是最新的,sql语句如下所示:
execute sp_fulltext_catalog 'FT_My_DB','start_incremental'
但是上面的两种方式都是我们自己去实现数据的同步,会损失一定的效率,我们可以用更好的一种方式:让sql server自己去做数据的同步,sql脚本如下所示:
USE DGA_DB;
GO
ALTER FULLTEXT INDEX ON [My_DB].[dbo].[Users] SET CHANGE_TRACKING AUTO;
GO
4:关于Sql Server的全文索引,我们可以参考MSDN来获取更多的内容: