SQL Server全文检索(Full-Text Search,简称FTS)是SQL Server内置的文本搜索组件,能够对字符型字段中的文本进行高效的分词和索引,支持复杂的文本匹配查询,避免传统LIKE查询全表扫描带来的性能问题,尤其适合处理博客内容、商品描述、文档存储等包含大量文本的场景。

全文检索和普通LIKE查询的区别
很多开发者习惯用LIKE语句做文本搜索,但是两者在适用场景和性能上有明显差异,具体对比如下:
| 对比维度 | LIKE查询 | 全文检索 |
|---|---|---|
| 索引方式 | 依赖普通索引,无法对文本内容做分词 | 基于分词创建全文索引,支持语义匹配 |
| 性能表现 | 大文本场景下全表扫描,性能差 | 走全文索引,查询速度快 |
| 支持功能 | 仅支持简单通配符匹配 | 支持词干提取、同义词、权重排序等高级功能 |
| 适用场景 | 短文本精确匹配、小数据量场景 | 长文本模糊搜索、大数据量文本检索场景 |
开启SQL Server全文检索的前置条件
要使用全文检索功能,首先需要确认SQL Server实例已经安装了全文检索组件,不同版本的安装方式略有差异,常规的检查和安装步骤如下:
- 打开SQL Server配置管理器,查看SQL Server服务列表中是否存在
SQL Full-text Filter Daemon Launcher服务,且状态为正在运行 - 如果未找到该服务,需要重新运行SQL Server安装程序,选择添加功能,勾选
全文检索和语义提取选项完成安装 - 安装完成后重启SQL Server服务,确保全文检索组件正常加载
创建全文索引的完整步骤
全文索引不能像普通索引一样直接创建,需要先创建全文目录,再关联表字段创建索引,具体步骤如下:
1. 创建全文目录
全文目录是存储全文索引的容器,执行以下语句创建目录:
-- 创建名为FT_Catalog_Demo的全文目录 CREATE FULLTEXT CATALOG FT_Catalog_Demo AS DEFAULT;
2. 创建全文索引
假设我们有一张文章表Article,结构如下:
CREATE TABLE Article (
Id INT PRIMARY KEY IDENTITY(1,1),
Title NVARCHAR(200),
Content NVARCHAR(MAX),
CreateTime DATETIME DEFAULT GETDATE()
);
现在为Title和Content字段创建全文索引,语句如下:
-- 为Article表的Title和Content字段创建全文索引
CREATE FULLTEXT INDEX ON Article(
Title LANGUAGE 2052, -- 2052代表简体中文分词
Content LANGUAGE 2052
)
KEY INDEX PK_Article_Id -- 关联主键索引,主键必须是唯一的
ON FT_Catalog_Demo; -- 关联之前创建的全文目录
创建完成后,可以通过系统视图查看全文索引状态:
-- 查询所有全文索引信息
SELECT
t.name AS TableName,
fi.unique_index_name,
fc.name AS CatalogName
FROM sys.fulltext_indexes fi
JOIN sys.tables t ON fi.object_id = t.object_id
JOIN sys.fulltext_catalogs fc ON fi.fulltext_catalog_id = fc.fulltext_catalog_id;
常用的全文检索查询语法
全文检索使用CONTAINS和FREETEXT两个核心谓词做查询,两者的匹配逻辑不同,适用场景也有区别。
1. CONTAINS精确匹配查询
CONTAINS支持更精确的匹配规则,可以指定词的前缀、短语、逻辑组合等,示例如下:
-- 查询Title中包含"SQL"的文章 SELECT * FROM Article WHERE CONTAINS(Title, 'SQL'); -- 查询Title中包含"SQL"开头的所有词,比如SQL Server、SQL语句等 SELECT * FROM Article WHERE CONTAINS(Title, '"SQL*"'); -- 查询Content中同时包含"全文检索"和"查询"的文章 SELECT * FROM Article WHERE CONTAINS(Content, '全文检索 AND 查询'); -- 查询Content中包含"数据库"或者"SQL"的文章 SELECT * FROM Article WHERE CONTAINS(Content, '数据库 OR SQL');
2. FREETEXT语义匹配查询
FREETEXT会做语义层面的匹配,自动提取关键词的变体、同义词,适合用户输入模糊搜索词的场景,示例如下:
-- 查询Content中包含和"数据库搜索"相关的所有文章,会自动匹配检索、查询等相关词 SELECT * FROM Article WHERE FREETEXT(Content, '数据库搜索');
全文检索的实用优化技巧
为了让全文检索的性能更好,查询结果更准确,可以参考以下优化技巧:
- 选择合适的分词语言:如果是中文内容,一定要指定语言为2052,避免默认英文分词导致中文词被拆分成单个字符
- 只给需要的字段创建全文索引:全文索引会占用额外的存储空间,不需要搜索的字段不要加入索引
- 定期重建全文索引:如果表数据频繁更新,可以定期执行
ALTER FULLTEXT INDEX ON Article START FULL POPULATION语句重建索引,保证索引数据和表数据一致 - 结合普通查询条件过滤:如果查询有固定的范围条件,比如时间范围,可以先过滤再走全文检索,减少检索的数据量
常见问题说明
在使用全文检索时,可能会遇到以下问题:
- 全文索引创建后查询不到数据:通常是索引还未填充完成,可以等待填充完成后再查询,或者手动触发完全填充
- 中文分词不准确:可以自定义同义词库,把常用的业务术语加入同义词文件,提升匹配准确率
- 查询性能突然下降:检查全文索引是否过期,或者表中是否存在大量碎片,及时重建索引即可恢复性能
SQL_Server全文检索查询优化FTS修改时间:2026-07-01 14:39:36