在给客户开发的门户网站中用到了整站搜索功能,在上线一年多后,在将近20个频道中(20张表),由于数据量越来越大,从而导致关键字搜索越来越慢,搜索一次将近20s的时间。所以最近决定优化搜索功能。
首先想到的就是用数据库的全文索引。freetext 函数!最终从查询20s骤降到不到1s出结果。
在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数据的速度,不用在用like,IndexOf这样低效率的模糊查询了。
解决方案:
一、开启数据库全文索引功能,使用sp_fulltext_database打开此功能
execute sp_fulltext_database 'enable'
二、新建全文目录
全文目录名称:自己起个名即可;
所有者:选择dbo;
三、选择增加索引的表和列,确定即可
四、全文索引的SQL查询
1、CONTAINS
搜索单个词和短语的精确或模糊的匹配项,要搜索的内容必须是个有意义的词语,比如说“苹果”、“建设厅”,不能是一些没意义的词语,比如“阿迪撒啊是”,“儿儿的”这样的词语即使LIKE是能查询出来,但全文索引对这样没意义的词语可能没有建立索引,查不出来
SELECT *
FROM dbo.Table
WHERE CONTAINS(title,'旅游')
2、FREETEXT
和CONTAINS类似,不同的是它会先把要查询的词语先进性分词然后在查询匹配项
select *
from dbo.Table
where freetext(title,'旅游')
3、CONTAINSTABLE
在查询方式上与 CONTAINS 几乎一样。但CONTAINSTABLE 返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用 CONTAINSTABLE 的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。
SELECT *
FROM Table AS FT_TBL
INNER JOIN CONTAINSTABLE(title, *, 'ISABOUT (婴儿 WEIGHT (.8),赤水 WEIGHT (.4) )')
AS KEY_TBL ON FT_TBL.tableid= KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
4、FREETEXTTABLE
在查询方式上与 FREETEXT 几乎一样。但 FREETEXTTABLE 返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用 FREETEXT 的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。