适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
本文介绍 SQL Server 2025(17.x)及更高版本中的全文索引版本更改。 它涵盖行为更改、所需的迁移步骤和新组件二进制文件。
SQL Server 2025 中的全文索引版本更改
SQL Server 2025 (17.x) 从 SQL Server 安装中移除了旧版断词器、词干分析器和筛选器二进制文件。 这些组件是使用新式工具集重新构建的,为更多语言和文档类型提供扩展的支持。 安装了 SQL Server 2025(17.x)的组件称为版本 2。 安装了 SQL Server 2022(16.x)和早期版本的组件称为版本 1。
就地升级后,现有全文索引在 index_version = 1 中显示为 。 新创建的索引默认使用版本 2 和新组件,除非你通过 FULLTEXT_INDEX_VERSION 数据库作用域配置另行指定。
第 2 版组件更改
版本 2 组件添加语言和文档类型支持,使用新的自定义模型,并且可以返回与版本 1 组件不同的标记化结果。
支持新语言
SQL Server 2025 (17.x) 添加了对三种新语言的全文索引的支持:
- 芬兰语(LCID 1035)
- 匈牙利语(LCID 1038)
- 爱沙尼亚语(LCID 1061)
支持新文档类型
默认情况下,SQL Server 2025 (17.x) 添加了对索引以下文档扩展的支持。
| 筛选器 | 分机 |
|---|---|
msgfilt02.dll |
.msg |
odffilt02.dll |
.odp、.ods、.odt |
offfilt02.dll |
.doc、.dot、.obd、.obt、.pot、.pps、.ppt、.xlb、.xlc、.xls、.xlt |
offfiltx02.dll |
.docm、.docx、.dotx、.pptm、.pptx、.xlsb、.xlsm、.xlsx、.zip |
onfilter02.dll |
.one |
意外结果
SQL Server 2025(17.x)中的新组件可能会将意外结果返回给应用程序。 例如,考虑英语 (LCID 1033) 断词器:
| 术语 | 使用以前断词器的结果 | 使用新断词器的结果 |
|---|---|---|
cat_dog |
cat_dog |
cat_dogcatdog |
$100 |
$100nn100usd |
\$100nn100\$ |
2026-01-09 |
2026-01-092026nn20260109 |
2026-01-09dd2026010920260109 |
自定义模型
第 2 版全文索引不再从 Windows 注册表中读取组件处理程序。 可以通过特定于实例的 JSON 文件控制自定义。 有关详细信息,请参阅 自定义筛选器和断字符。
升级和迁移选项
由于 SQL Server 2025 (17.x) 移除了所有版本 1 二进制文件,使用版本 1 索引的全文查询和填充在就地升级后会失败。 有关详细信息,请参阅 SQL Server 2025 中数据库引擎功能的重大变更。
升级到 SQL Server 2025(17.x)或更高版本后,或者准备在 Azure SQL 数据库 和 Azure SQL 托管实例 中弃用版本 1 索引时,请使用以下方法之一。
查找版本 1 的索引
在每个使用 Full-Text 搜索的数据库中运行以下查询,以查找仍使用版本 1 组件的索引:
SELECT fc.[name] AS catalog_name,
OBJECT_SCHEMA_NAME(fi.object_id) AS schema_name,
OBJECT_NAME(fi.object_id) AS table_name,
fi.object_id,
fi.*
FROM sys.fulltext_indexes AS fi
INNER JOIN sys.fulltext_catalogs AS fc
ON fi.fulltext_catalog_id = fc.fulltext_catalog_id
WHERE fi.index_version = 1;
使用版本 2 组件重新生成现有索引
重新生成现有的全文索引以使用版本 2 组件。 确认 FULLTEXT_INDEX_VERSION 已设置为 2,然后重建全文目录。
SELECT *
FROM sys.database_scoped_configurations
WHERE [name] = 'FULLTEXT_INDEX_VERSION';
ALTER FULLTEXT CATALOG [FtCatalog] REBUILD;
注释
目录重新生成作将重新生成所有全文索引。 如果要控制索引生成的顺序或减少资源要求, 请单独删除并重新创建 全文索引。
继续使用版本 1 组件
仅对可在SQL Server安装中管理文件的SQL Server实例使用此选项。
Important
Linux 上的 SQL Server 已弃用版本 1。 在 SQL Server 2025(17.x)及更高版本中, mssql-server-fts 包不包含版本 1 二进制文件。 尝试安装不匹配的版本 mssql-server-fts 和 mssql-server 包不受支持,并导致全文失败。
如果需要在版本 1 上保持应用程序兼容性,请设置为 FULLTEXT_INDEX_VERSION = 1 避免在重新生成期间意外升级到版本 2。
ALTER DATABASE SCOPED CONFIGURATION
SET FULLTEXT_INDEX_VERSION = 1;
接下来,将旧实例 Binn 文件夹中的旧版断词器、词干分析器和筛选器二进制文件复制到目标实例的 Binn 文件夹。 有关按语言或文档类型需要复制哪些 DLL 及其依赖库的参考信息,请参阅 全文筛选器二进制文件 和 全文分词器和词干分析器二进制文件。
若要批量复制版本 1 的整套二进制文件,请将以下脚本复制到名为 Copy-FulltextV1Components.ps1 的文件中。
<#
.SYNOPSIS
Copies the Full-Text V1 components from one SQL install's Binn folder to another.
Existing files are never overwritten; each file reports OK, SKIP or FAIL.
.EXAMPLE
.\Copy-FulltextV1Components.ps1 `
-SourceBinn 'C:\Program Files\Microsoft SQL Server\MSSQL16.INST1\MSSQL\Binn' `
-TargetBinn 'C:\Program Files\Microsoft SQL Server\MSSQL17.INST2\MSSQL\Binn'
#>
param(
[Parameter(Mandatory)] [string] $SourceBinn,
[Parameter(Mandatory)] [string] $TargetBinn
)
$components = @(
'infosoft.dll',
'LangWrbk.dll',
'korwbrkr.dll',
'korwbrkr.lex',
'msfte.dll',
'xmlfilt.dll',
'MsWb7.dll',
'MsWb70011.dll',
'MsWb7001e.dll',
'MsWb70404.dll',
'MsWb70804.dll',
'NaturalLanguage6.dll',
'NL7Data0011.dll',
'NL7Data001e.dll',
'NL7Data0404.dll',
'NL7Data0804.dll',
'NL7Lexicons0011.dll',
'NL7Lexicons001e.dll',
'NL7Lexicons0404.dll',
'NL7Lexicons0804.dll',
'NL7Models0011.dll',
'NL7Models001e.dll',
'NL7Models0404.dll',
'NL7Models0804.dll',
'nlhtml.dll',
'nls400.dll',
'NlsData0000.dll',
'NlsData0002.dll',
'NlsData0003.dll',
'NlsData000a.dll',
'NlsData000c.dll',
'NlsData000d.dll',
'NlsData000f.dll',
'NlsData0010.dll',
'NlsData0018.dll',
'NlsData001a.dll',
'NlsData001b.dll',
'NlsData001D.dll',
'NlsData0020.dll',
'NlsData0021.dll',
'NlsData0022.dll',
'NlsData0024.dll',
'NlsData0026.dll',
'NlsData0027.dll',
'NlsData002a.dll',
'NlsData0039.dll',
'NlsData003e.dll',
'NlsData0045.dll',
'NlsData0046.dll',
'NlsData0047.dll',
'NlsData0049.dll',
'NlsData004a.dll',
'NlsData004b.dll',
'NlsData004c.dll',
'NlsData004e.dll',
'NlsData0414.dll',
'NlsData0416.dll',
'NlsData0816.dll',
'NlsData081a.dll',
'NlsData0c1a.dll',
'Nlsdl.dll',
'NlsLexicons0002.dll',
'NlsLexicons0003.dll',
'NlsLexicons000a.dll',
'NlsLexicons000c.dll',
'NlsLexicons000d.dll',
'NlsLexicons000f.dll',
'NlsLexicons0010.dll',
'NlsLexicons0018.dll',
'NlsLexicons001a.dll',
'NlsLexicons001b.dll',
'NlsLexicons001D.dll',
'NlsLexicons0020.dll',
'NlsLexicons0021.dll',
'NlsLexicons0022.dll',
'NlsLexicons0024.dll',
'NlsLexicons0026.dll',
'NlsLexicons0027.dll',
'NlsLexicons002a.dll',
'NlsLexicons0039.dll',
'NlsLexicons003e.dll',
'NlsLexicons0045.dll',
'NlsLexicons0046.dll',
'NlsLexicons0047.dll',
'NlsLexicons0049.dll',
'NlsLexicons004a.dll',
'NlsLexicons004b.dll',
'NlsLexicons004c.dll',
'NlsLexicons004e.dll',
'NlsLexicons0414.dll',
'NlsLexicons0416.dll',
'NlsLexicons0816.dll',
'NlsLexicons081a.dll',
'NlsLexicons0c1a.dll',
'Prm0001.bin',
'Prm0005.bin',
'Prm0006.bin',
'Prm0007.bin',
'Prm0008.bin',
'Prm0009.bin',
'Prm0013.bin',
'Prm0015.bin',
'Prm0019.bin',
'Prm001f.bin'
)
if (-not (Test-Path -LiteralPath $SourceBinn -PathType Container)) { throw "Source Binn folder not found: $SourceBinn" }
if (-not (Test-Path -LiteralPath $TargetBinn -PathType Container)) { throw "Target Binn folder not found: $TargetBinn" }
if ((Split-Path -Leaf $SourceBinn) -ne 'Binn') { throw "Source path must be a Binn folder: $SourceBinn" }
if ((Split-Path -Leaf $TargetBinn) -ne 'Binn') { throw "Target path must be a Binn folder: $TargetBinn" }
$ok = 0; $skip = 0; $fail = 0
foreach ($name in $components) {
$srcFile = Join-Path $SourceBinn $name
$dstFile = Join-Path $TargetBinn $name
if (-not (Test-Path -LiteralPath $srcFile)) {
Write-Host "[FAIL] $name (source not found)" -ForegroundColor Red
$fail++
}
elseif (Test-Path -LiteralPath $dstFile) {
Write-Warning "[SKIP] $name already exists in target; not overwritten"
$skip++
}
else {
try {
Copy-Item -LiteralPath $srcFile -Destination $dstFile -ErrorAction Stop
Write-Host "[ OK ] $name" -ForegroundColor Green
$ok++
}
catch {
Write-Host "[FAIL] $name ($($_.Exception.Message))" -ForegroundColor Red
$fail++
}
}
}
Write-Host ""
Write-Host "Copied $ok, skipped $skip, failed $fail of $($components.Count)."
在管理员 PowerShell 窗口中运行脚本,其中SourceBinnSQL Server 2022(16.x)或早期实例的文件夹的路径Binn包含版本 1 二进制文件,TargetBinn并且是需要继续支持版本 1 的 SQL Server 2025 (17.x) 或更高版本实例的文件夹的路径Binn。
.\Copy-FulltextV1Components.ps1 `
-SourceBinn 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn' `
-TargetBinn 'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Binn'
版本 1 状态和按环境划分的弃用时间表
| 环境 | 地位 | 需要采取行动 |
|---|---|---|
| SQL Server 2025 (17.x) 及更高版本 | 从SQL Server安装中删除版本 1 二进制文件。 就地升级后版本 1 查询和填充失败。 | 使用版本 2 组件重新生成或重新创建全文索引。 如果需要版本 1 进行兼容性,请仅在支持的位置使用版本 1。 |
| 采用 SQL Server 2025 更新策略的 Azure SQL 托管实例 | 版本 1 弃用正在分阶段推出。 受影响的客户会在弃用前定期收到电子邮件提醒。 | 在实例受到影响之前,使用版本 2 组件重新生成或重新创建全文索引。 如果无法立即升级,请联系Microsoft支持部门。 |
| Azure SQL 数据库 和 Azure SQL 托管实例 采用“Always-up-to-date”更新策略 | 目前仍支持版本 1 索引,但计划删除。 新创建的或重新生成的索引将开始默认使用版本 2。 | 提前盘点版本 1 的索引,并规划使用版本 2 组件进行重建,以最大限度地减少停机时间。 |
Azure SQL弃用时间线
适用范围:Azure SQL 数据库和 Azure SQL 托管实例
Azure SQL 数据库和Azure SQL 托管实例尚未删除版本 1 二进制文件。 从 SQL Server 2025 更新策略上的Azure SQL 托管实例开始,这些产品/服务将经历暂存弃用,以便有时间重新生成现有索引。 受影响的客户在弃用前收到定期电子邮件提醒。
版本 1 弃用后,对版本 1 索引的查询失败,并显示错误消息:
Msg 30011, Level 16, State 1, Line 37
Full-text index version 1 is not supported by this instance configuration. Rebuild or recreate the index with database scoped configuration FULLTEXT_INDEX_VERSION = 2. For more information, see https://aka.ms/fts-version-upgrade. If unable to upgrade, contact support for assistance.
并且填充失败,在爬网日志中出现以下错误:
Error: 30011, Severity: 16, State: 1.
Full-text index version 1 is not supported by this instance configuration. Rebuild or recreate the index with database scoped configuration FULLTEXT_INDEX_VERSION = 2. For more information, see https://aka.ms/fts-version-upgrade. If unable to upgrade, contact support for assistance.
Error: 30059, Severity: 16, State: 1.
A fatal error occurred during a full-text population and caused the population to be cancelled. Population type is: <population_type>; database name is <database_name> (id: <database_id>); catalog name is <catalog_name> (id: <catalog_id>); table name <table_name> (id: <table_id>). Fix the errors that are logged in the full-text crawl log. Then, resume the population. The basic Transact-SQL syntax for this is: ALTER FULLTEXT INDEX ON table_name RESUME POPULATION.