Обновление полнотекстового индекса

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL Azure

В этой статье описывается изменение версии полнотекстового индекса в 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 в sys.fulltext_indexes. Вновь созданные индексы используют версию 2 и новые компоненты, если не указано иное с помощью конфигурации области действия базы данных FULLTEXT_INDEX_VERSION.

Изменения компонентов версии 2

Компоненты версии 2 добавляют поддержку языков и типов документов, используют новую модель настройки и могут возвращать различные результаты маркеризации, отличные от компонентов версии 1.

Поддержка новых языков

SQL Server 2025 (17.x) добавляет поддержку полнотекстового индексирования на трех новых языках:

  • Финский (LCID 1035)
  • Венгерский (LCID 1038)
  • Эстония (LCID 1061)

Поддержка новых типов документов

SQL Server 2025 (17.x) добавляет поддержку индексирования следующих расширений документов по умолчанию.

Фильтр Extension
msgfilt02.dll .msg
odffilt02.dll .odp, .ods, .odt
offfilt02.dll .doc, .pps, .ppt, .xlb, .xls, .xlc, .pot, .obt, .obd, .dot, .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) или более поздних версий SQL Server либо при подготовке индексов версии 1 к выводу из эксплуатации в База данных SQL Azure и Управляемый экземпляр SQL Azure.

Поиск индексов версии 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;

Note

Операция перестроения каталога перестраивает все полнотекстовые индексы. Если вы хотите управлять порядком сборки индекса или уменьшить требования к ресурсам, удалите и повторно создайте полнотекстовые индексы по отдельности.

Продолжайте использовать компоненты версии 1

Используйте этот параметр только для экземпляров SQL Server, для которых можно управлять файлами в установке SQL Server.

Important

Версия 1 устарела для SQL Server в Linux. В 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;

Затем скопируйте устаревшие двоичные файлы модуля разбиения слов, stemmer и фильтра из папки более старого экземпляра 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 администратора, где SourceBinn находится путь к Binn папке SQL Server 2022 (16.x) или более ранней версии, содержащей двоичные файлы версии 1, и TargetBinn это путь к Binn папке SQL Server 2025 (17.x) или более поздней версии, требующей поддержки версии 1.

.\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 и сроки прекращения поддержки по средам

Окружающая среда Status Обязательное действие
SQL Server 2025 (17.x) и более поздних версий Двоичные файлы версии 1 удаляются из установки SQL Server. Запросы и популяции версии 1 перестают работать после обновления без переустановки. Перестройте или повторно создайте полнотекстовые индексы с компонентами версии 2. Если вам нужна версия 1 для совместимости, используйте версию 1 только в том случае, если она поддерживается.
Управляемый экземпляр SQL Azure в рамках политики обновления SQL Server 2025 Вывод из эксплуатации версии 1 внедряется поэтапно. Клиенты, которых это затрагивает, заранее получают регулярные напоминания по электронной почте перед прекращением поддержки. Перестройте или пересоздайте полнотекстовые индексы с компонентами версии 2, прежде чем это повлияет на ваш экземпляр. Если вы не сможете немедленно обновиться, обратитесь в службу поддержки Microsoft.
База данных SQL Azure и Управляемый экземпляр SQL Azure с политикой обновления "Always-up-to-date" Индексы версии 1 по-прежнему поддерживаются сегодня, но удаление планируется. Только что созданные или перестроенные индексы по умолчанию начинают использовать версию 2. Проведите инвентаризацию индексов версии 1 и заранее спланируйте их перестроение с использованием компонентов версии 2, чтобы свести к минимуму время простоя.

График вывода из эксплуатации Azure SQL

Область применения: База данных SQL Azure и Управляемый экземпляр SQL Azure

База данных SQL Azure и Управляемый экземпляр SQL Azure пока не удаляют двоичные файлы версии 1. Эти продукты проходят поэтапный вывод из эксплуатации, чтобы дать время на перестроение существующих индексов, начиная с Управляемый экземпляр SQL Azure с политикой обновлений SQL Server 2025. Затронутые клиенты получают периодические напоминания по электронной почте перед прекращением использования.

После того как версия 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.