SqlServer如何创建全文索引

✅ 一、SQL Server 全文索引创建步骤(完整可执行)

1.1 前置检查(必须通过)

全文索引不是默认功能,很多开发环境根本没装。 请先在 SSMS 执行以下命令验证:

sql 复制代码
-- 检查1:全文搜索组件是否已安装
SELECT SERVERPROPERTY('IsFullTextInstalled') AS IsFullTextInstalled;
  • 返回值 = 1:继续下一步

  • 返回值 = 0 :必须找DBA安装全文组件(SQL Server安装介质修复,添加"全文和语义提取搜索"功能)

1.2 为当前数据库启用全文索引

sql 复制代码
EXEC sp_fulltext_database 'enable';

注意:该命令并非所有SQL Server版本必须,但执行无害。若报错"已启用",忽略即可

1.3 创建全文目录(容器)

sql 复制代码
CREATE FULLTEXT CATALOG FT_Catalog_LogRequest 
WITH ACCENT_SENSITIVITY = OFF;
  • ACCENT_SENSITIVITY = OFF:匹配时忽略重音(对中文无影响,推荐)

  • 如果只需要一个默认目录 ,可执行 CREATE FULLTEXT CATALOG FT_Catalog_LogRequest AS DEFAULT;

1.4 在目标表上创建全文索引------这是你的核心需求

sql 复制代码
CREATE FULLTEXT INDEX ON dbo.LogRequests
(
    ParamJson          -- 你要高速检索的大字段
        LANGUAGE 2052, -- 2052 = 简体中文。必须指定!否则中文分词失效
    ApiMethod,         -- (可选)其他需要全文检索的字段
    SysCode            -- (可选)
)
KEY INDEX PK_LogRequests   -- 表的主键名,必须单列、唯一、非空
ON FT_Catalog_LogRequest   -- 全文目录名,使用上一步创建的
WITH 
(
    CHANGE_TRACKING AUTO,      -- 自动跟踪数据变更(推荐)
    -- 或:CHANGE_TRACKING MANUAL, 手动更新;STOPLIST = SYSTEM   -- 使用系统停用词表
);

关于 LANGUAGE 2052 的严重性 :

如果不指定 LANGUAGE 2052,SQL Server 会使用默认语言(通常是英语)。英文分词器按空格分词,会把"托盘条码"整个当成一个词,根本无法匹配你输入的关键词,导致全文索引建了也白建

1.5 首次填充索引(立即生效)

sql 复制代码
ALTER FULLTEXT INDEX ON dbo.LogRequests START FULL POPULATION;
  • 数据量大时此操作消耗I/O,建议在业务低峰期执行。

  • 执行期间,已有数据的检索功能不可用,但表本身的增删改查不受影响。

✅ 二、创建完成后的验证与查询

2.1 验证索引是否创建成功

sql 复制代码
-- 查看该表上的全文索引
SELECT * FROM sys.fulltext_indexes 
WHERE object_id = OBJECT_ID('dbo.LogRequests');

-- 查看全文目录下的所有索引
SELECT * FROM sys.fulltext_catalogs;

2.2 正确使用全文检索(严禁再用LIKE)

错误用法(全表扫描):

sql 复制代码
SELECT * FROM LogRequests WHERE ParamJson LIKE '%托盘条码123%';

正确用法(秒级响应):

sql 复制代码
-- 精确匹配关键词
SELECT Id, ApiMethod, RequestTime 
FROM LogRequests 
WHERE CONTAINS(ParamJson, '托盘条码123');

-- 多个关键词(AND关系)
SELECT Id, ApiMethod, RequestTime 
FROM LogRequests 
WHERE CONTAINS(ParamJson, '托盘 AND 条码');

-- 短语匹配(完全包含)
SELECT Id, ApiMethod, RequestTime 
FROM LogRequests 
WHERE CONTAINS(ParamJson, '"托盘条码123"');

-- 同时检索多个字段
SELECT Id, ApiMethod, RequestTime 
FROM LogRequests 
WHERE CONTAINS((ParamJson, ApiMethod), '托盘');
相关推荐
闲云自留地3 分钟前
主库倒下 30 秒自动扶正:MySQL MHA 高可用实战
数据库·mysql
许彰午9 小时前
01-Oracle数据库简介与版本选择
数据库·oracle
菜鸟~noob2339 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
Seraphina3611 小时前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
盟接之桥12 小时前
AI助手:你的7×24小时智能管家——让异常预警无处不在
大数据·网络·数据库·人工智能·制造·ai编程
waoooqwe12 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
可乐ea13 小时前
Agent 评测换判据:用终态数据库状态判定任务是否完成
数据库·ui·oracle·mcp工具·agent评测·终态断言·智能体可靠性
l1t13 小时前
DeepSeek总结的一个不含数据的 DuckDB 数据库
服务器·数据库·duckdb
PaperData14 小时前
2007-2020年税收调查面板数据
数据库
程序员清风14 小时前
CSV、Excel 与数据库数据读取实践
数据库·oracle·excel