适用于: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。
就地升级后,现有全文索引在 sys.fulltext_indexes 中显示为 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 文件夹。 请参阅SQL Server 全文搜索中的筛选器和断字器,了解按语言或文档类型需要复制哪些 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.