全文索引版本升级

适用于:SQL ServerAzure 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_dog
cat
dog
$100 $100
nn100usd
\$100
nn100\$
2026-01-09 2026-01-09
2026
nn2026
01
09
2026-01-09
dd20260109
2026
01
09

自定义模型

第 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-ftsmssql-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.