SQL Server 之 Full-Text Search 全文搜索

SQL Server 的 全文搜索(Full-Text Search) 是一种高性能、支持自然语言查询的文本检索功能,特别适用于对 大文本字段(如 VARCHAR(MAX)、NVARCHAR、TEXT 等)进行关键词搜索,相比 LIKE '%关键词%' 有显著优势。

一、为什么需要 Full-Text Search?

典型场景:电商商品名称/描述搜索

新闻文章内容检索

用户评论关键词分析

二、启用 Full-Text Search(前提)

(默认安装通常已包含)

  • SQL Server 安装时需勾选 "Full-Text and Semantic Extractions for Search"
  • 数据库必须启用全文搜索:
sql 复制代码
-- 检查是否启用
SELECT DATABASEPROPERTYEX('YourDB', 'IsFullTextEnabled');
-- 返回 1 表示已启用

-- 若未启用,执行:
EXEC sp_fulltext_database 'enable';

三、创建全文索引(Full-Text Index)

步骤 1:确保表有唯一非空索引(通常是主键)

sql 复制代码
CREATE TABLE Articles (
    Id INT IDENTITY PRIMARY KEY,        -- 必须有唯一索引
    Title NVARCHAR(200),
    Content NVARCHAR(MAX),
    CreatedDate DATETIME
);

步骤 2:创建全文目录(Catalog)

sql 复制代码
-- 创建全文目录(逻辑容器)
CREATE FULLTEXT CATALOG ft_catalog AS DEFAULT;

步骤 3:在目标列上创建全文索引

sql 复制代码
-- 对 Title 和 Content 列创建全文索引
CREATE FULLTEXT INDEX ON Articles (
    Title LANGUAGE 1033,          -- 1033 = English, 2052 = 简体中文
    Content LANGUAGE 2052         -- 中文分词需指定 LANGUAGE 2052
)
KEY INDEX PK__Articles__Id      -- 指定唯一键索引名(通常是主键)
ON ft_catalog                   -- 指定目录
WITH CHANGE_TRACKING AUTO;      -- 自动跟踪数据变更

中文支持关键:必须指定 LANGUAGE 2052(简体中文)或 LANGUAGE N'Chinese (Simplified)'

SQL Server 2017+ 内置中文分词器(无需额外安装)

四、使用全文搜索查询

  1. CONTAINS ------ 精确关键词/短语搜索
sql 复制代码
-- 搜索 Title 或 Content 中包含 "数据库" 的文章
SELECT * FROM Articles
WHERE CONTAINS((Title, Content), N'数据库');

-- 搜索短语(带引号)
SELECT * FROM Articles
WHERE CONTAINS(Content, '"高性能数据库"');

-- 多关键词(AND / OR)
SELECT * FROM Articles
WHERE CONTAINS(Title, N'"SQL" AND "优化"');

-- 前缀匹配(* 通配符)
SELECT * FROM Articles
WHERE CONTAINS(Title, N'"数据*"');  -- 匹配 "数据库", "数据中心" 等
  1. FREETEXT ------ 自然语言搜索(自动分词、同义词)
sql 复制代码
-- 自动匹配相关词(如搜 "汽车" 可能返回 "轿车"、"车辆")
SELECT * FROM Articles
WHERE FREETEXT((Title, Content), N'新能源汽车技术');
  1. CONTAINSTABLE / FREETEXTTABLE ------ 返回相关性排名
sql 复制代码
-- 获取匹配结果并按相关性排序(Rank 越高越相关)
SELECT a.*, ft.Rank
FROM Articles a
INNER JOIN CONTAINSTABLE(Articles, (Title, Content), N'数据库') ft
    ON a.Id = ft.[KEY]
ORDER BY ft.Rank DESC;

五、中文分词注意事项

  1. 验证中文分词是否生效
sql 复制代码
-- 查看 "数据库优化" 如何被分词
SELECT display_term, occurrence_count
FROM sys.dm_fts_parser(N'"数据库优化"', 2052, 0, 0);
-- 预期输出:数据库、优化(两个词)
  1. 常见问题

→ 检查是否指定了 LANGUAGE 2052

→ 检查全文索引是否已填充(见下文)

  • 搜索不到结果?
  • 单字无法搜索?

→ SQL Server 中文分词默认不索引单字(如搜 "数" 可能无效),建议用双字以上词

六、管理全文索引

手动启动索引填充(首次创建后需执行)

sql 复制代码
-- 完全填充
ALTER FULLTEXT INDEX ON Articles START FULL POPULATION;

-- 增量填充(基于时间戳列)
ALTER FULLTEXT INDEX ON Articles START INCREMENTAL POPULATION;

查看索引状态

sql 复制代码
-- 查询填充进度
SELECT 
    OBJECT_NAME(object_id) AS TableName,
    status_description
FROM sys.dm_fts_index_population;

删除全文索引

sql 复制代码
DROP FULLTEXT INDEX ON Articles;
DROP FULLTEXT CATALOG ft_catalog;

七、性能与最佳实践

常见误区

1 以为全文索引是"普通索引的增强版"

→ 它是独立的倒排索引结构,和 B-Tree 索引完全不同。

2 在 WHERE 中混用 LIKE 和 CONTAINS

→ 应优先用 CONTAINS,避免 LIKE 拖慢性能。

3 未处理停用词(Stopwords)

→ 如 "的"、"是" 等高频词默认被忽略,可通过自定义停用词表调整。

示例:电商商品搜索

sql 复制代码
-- 商品表
CREATE TABLE Products (
    Id INT PRIMARY KEY,
    Name NVARCHAR(200),
    Description NVARCHAR(MAX)
);

-- 创建全文索引(中文)
CREATE FULLTEXT INDEX ON Products (Name, Description LANGUAGE 2052)
KEY INDEX PK__Products__Id
ON ft_catalog;

-- 搜索 "华为手机"
SELECT Id, Name, Description
FROM Products
WHERE CONTAINS((Name, Description), N'华为 AND 手机')
ORDER BY Id;

当你的应用需要对大文本字段做高效、智能的关键词搜索时,Full-Text Search 是 SQL Server 的最佳选择。中文场景:务必指定 LANGUAGE 2052

性能关键:用 CONTAINS 替代 LIKE '%...%'

用户体验:用 CONTAINSTABLE 实现"相关度排序"

相关推荐
2401_873587822 小时前
Linux——应用层协议定制
linux·运维·网络协议
李少兄2 小时前
数据库开发中的布尔表示:0 与 1 的语义规范
数据库·数据库开发
大榕树信息科技2 小时前
动环监控如何提升数据中心的运维效率和安全性?
运维·网络·物联网·机房管理系统·动环监控系统
小王努力学编程2 小时前
LangChain——AI应用开发框架(核心组件1)
linux·服务器·前端·数据库·c++·人工智能·langchain
麦聪聊数据3 小时前
重构数据交付链路:基于 API 网关实现数据工程与业务分析的解耦
数据库·sql
SJLoveIT3 小时前
深度复盘:海量数据下的 SQL 优化与生命周期治理
数据库·sql
TH_13 小时前
37、SQL的Explain
java·数据库·sql
AC赳赳老秦3 小时前
Confluence + DeepSeek:构建自动化、智能化的企业知识库文档生成与维护体系
大数据·运维·人工智能·自动化·jenkins·数据库架构·deepseek
馨谙4 小时前
shell编程三剑客------sed流编辑器基础应用大全以及运行示例
linux·运维·编辑器