在公司项目中提出了一个需求:
搜索包含指定关键词的数据。得到这需求后,站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后,发现“Like”查询满足不到实际的要求。
示例:
--------------------------------------------------------------------
关键词:牛仔 骨(注:词中间有空格)
搜索名称中包含有“牛仔”或“骨”的数据返回显示(即名称中包含美食或鸡的数据都要返回),有点类似搜索引擎的做法(当然两者之间还是有天渊之别的,搜索引擎有一套自己的复杂算法支撑着)
方案分析:
一. “Like”语句
“Like”语句官方解决:确定特定字符 String 是否与指定模式相匹配。
select * from Table where name Like '%牛仔 骨%'
查询结果返回名称中包含“牛仔 骨”看作一个独立词前后模糊相匹配的数据
没有将包含“牛仔”或“骨”关键词条件的所有数据查询出来
显然,使用“Like”语句查询方案无法满足到实际需求,需要寻找其他解决方案来实现。
SQL Server 提供了一种叫“全文索引(FULLTEXT)”搜索技术能够很好满足这种查询的需求。
二、全文索引(FULLTEXT)
全文索引是一种特殊类型的基于标记的功能性索引,是由Microsoft SQL Server全文引擎服务创建和维护的。从 SQL Server 2008 开始,全文索引与数据库引擎集成在一起。
每个表只允许有一个全文索引。
若要对某个表创建全文索引,该表必须具有一个唯一且非 Null 的列(建议使用整型作为主键列)。
支持以下类型的列表创建全文索引:char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max)。对数据类型为 varbinary、varbinary(max)、image或xml 的列创建全文索引需要您指定类型列。类型列是用来存储每行中文档的文件扩展名(.doc、.pdf、.xls等)的表列。
创建和维护全文索引的过程称为“填充”。有三种类型的全文索引填充:完全填充、基于更改跟踪的填充和基于时间戳的增量式填充。
以下使用“基于时间戳的增量式填充”来创建全文索引,其他类型的详细信息,请参阅填充全文索引。
创建全文索引示例SQL语句:
--创建全文目录
CREATE FULLTEXT CATALOG FT AS DEFAULT;
go
--创建全文索引
CREATE FULLTEXT INDEX ON [dbo].[Test](Food)
KEY INDEX Id
GO
参考资料:
创建和管理全文索引 - SQL Server | Microsoft Learn
全文搜索入门 - SQL Server | Microsoft Learn