ALTER FULLTEXT INDEX (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Изменяет свойства полнотекстового индекса в SQL Server.

Соглашения о синтаксисе Transact-SQL

Синтаксис

ALTER FULLTEXT INDEX ON table_name
   { ENABLE
   | DISABLE
   | SET CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF }
   | ADD ( column_name
           [ TYPE COLUMN type_column_name ]
           [ LANGUAGE language_term ]
           [ STATISTICAL_SEMANTICS ]
           [ , ...n ]
         )
     [ WITH NO POPULATION ]
   | ALTER COLUMN column_name
     { ADD | DROP } STATISTICAL_SEMANTICS
     [ WITH NO POPULATION ]
   | DROP ( column_name [ , ...n ] )
     [ WITH NO POPULATION ]
   | START { FULL | INCREMENTAL | UPDATE } POPULATION
   | { STOP | PAUSE | RESUME } POPULATION
   | SET STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
     [ WITH NO POPULATION ]
   | SET SEARCH PROPERTY LIST [ = ] { OFF | property_list_name }
     [ WITH NO POPULATION ]
   }
[ ; ]

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

table_name

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

ENABLE | DISABLE

Указывает SQL Server, нужно ли собирать данные полнотекстового индекса для table_name. Значение ENABLE активирует полнотекстовый индекс, значение DISABLE отключает. Таблица не поддерживает полнотекстовые запросы во время отключения индекса.

Отключение полнотекстового индекса позволяет отключить отслеживание изменений, но при этом сохранить полнотекстовый индекс, который можно повторно включить с помощью инструкции ENABLE. Если полнотекстовый индекс отключен, метаданные полнотекстового индекса остаются в системных таблицах. Если CHANGE_TRACKING находится в состоянии включено (автоматическое или ручное обновление) при отключении полнотекстового индекса, состояние индекса зависает, все текущие остановки обхода и новые изменения данных таблицы не отслеживаются или не распространяются на индекс.

SET CHANGE_TRACKING { MANUAL | AUTO | OFF }

Указывает, будет ли SQL Server распространять на полнотекстовый индекс изменения (обновления, удаления или вставки), выполненные в столбцах таблицы, которые включены в полнотекстовый индекс. Изменения данных с помощью WRITETEXT и UPDATETEXT не отражаются в полнотекстовом индексе и не собираются с отслеживанием изменений.

Примечание.

Дополнительные сведения см. в разделе Взаимодействие между отслеживанием изменений и параметром NO POPULATION.

  • MANUAL

    Указывает, что отслеживаемые изменения распространяются вручную путем вызова ALTER FULLTEXT INDEX ... Инструкция START UPDATE POPULATION Transact-SQL (ручное заполнение). Агент SQL Server можно использовать для периодического вызова инструкции Transact-SQL.

  • АВТОМАТИЧЕСКИ

    Указывает, что отслеживаемые изменения распространяются автоматически по мере изменения данных в базовой таблице (автоматическое заполнение). Изменения могут распространяться автоматически, однако это не значит, что они будут немедленно отражаться в полнотекстовом индексе. Аргумент AUTO используется по умолчанию.

  • ВЫКЛ.

    Указывает, что SQL Server не сохраняет список изменений индексированных данных.

ADD | DROP column_name

Указывает столбцы, добавляемые или удаляемые из полнотекстового индекса. Столбец или столбцы должны иметь тип char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary или varbinary(max).

Предложение DROP используется только для столбцов, ранее включенных для полнотекстового индексирования.

Следует использовать параметры TYPE COLUMN и LANGUAGE с предложением ADD, чтобы назначить эти свойства для столбца column_name. После добавления столбца полнотекстовый индекс таблицы должен быть заполнен повторно, чтобы обеспечить выполнение полнотекстовых запросов к этому столбцу.

Примечание.

Заполняется ли полнотекстовый индекс после добавления или удаления столбца полнотекстового индекса, зависит от того, включено ли отслеживание изменений и указано ли предложение WITH NO POPULATION. Дополнительные сведения см. в разделе Взаимодействие между отслеживанием изменений и параметром NO POPULATION.

TYPE COLUMN type_column_name

Указывает имя столбца таблицы, type_column_name, который используется для хранения типа документа для varbinary, varbinary(max)или документа изображения. Этот столбец, известный как столбец типа, содержит расширение файла, предоставленное пользователем (.doc, и .pdf.xlsт. д.). Столбец типа должен иметь тип char, nchar, varcharили nvarchar.

Указывайте параметр TYPE COLUMN type_column_name только в случае, когда в параметре column_name указан столбец типа varbinary, varbinary(max) или image, где данные хранятся в двоичном виде. В противном случае SQL Server возвратит ошибку.

Примечание.

Во время индексирования средство полнотекстового поиска использует сокращение в столбце типа каждой строки таблицы, чтобы определить, какой фильтр полнотекстового поиска нужно использовать для документа, указанного в параметре column_name. Фильтр загружает документ в виде двоичного потока, удаляет данные форматирования и отправляет текст из документа в компонент разбиения по словам. Дополнительные сведения см. в разделе Настройка фильтров для поиска и управление ими.

LANGUAGE language_term

Язык данных, хранящихся в column_name.

Аргумент language_term не является обязательным и может быть строкой, целым числом или шестнадцатеричным значением, соответствующим идентификатору локали (LCID). Если аргумент language_term задан, то соответствующий язык будет применяться ко всем элементам условия поиска. Если не указано никакого значения, по умолчанию используется язык полнотекстового поиска экземпляра SQL Server.

sp_configure Используйте хранимую процедуру для доступа к сведениям о полнотекстовом языке по умолчанию экземпляра SQL Server.

При указании в виде строки language_term соответствует alias значению столбца в системной sys.syslanguages таблице. Строка должна быть заключена в одиночные кавычки: 'language_term'. Если значением аргумента language_term является целое число, оно представляет собой действительный код языка. Если значение language_term задано в шестнадцатеричной форме, то после символов "0x" должна следовать шестнадцатеричная запись кода языка. Длина шестнадцатеричного значения не должна превышать восьми цифр, включая ведущие нули.

Если значение указано в формате двухбайтовой кодировки (DBCS), SQL Server преобразует его в Юникод.

Для указанного аргументом language_term языка должны быть включены ресурсы, такие как средства разбиения по словам и парадигматические модули. Если такие ресурсы не поддерживают указанный язык, SQL Server возвращает ошибку.

Для столбцов, имеющих типы, отличные от BLOB и XML, которые содержат текстовые данные на нескольких языках, или в случаях, когда язык текста в столбце неизвестен, используйте нейтральный (0x0) языковой ресурс. Для документов, хранящихся в столбцах типа XML или BLOB, кодирование языка в документе используется во время индексирования. Например, в XML-столбцах атрибут в XML-документах xml:lang определяет язык. Во время запроса значение, ранее указанное для аргумента language_term, становится используемым по умолчанию языком в полнотекстовых индексах, если аргумент language_term не указан как часть полнотекстового запроса.

STATISTICAL_SEMANTICS

Применимо: SQL Server 2012 (11.x) и более поздних версий.

Создает дополнительные индексы ключевых фраз и подобия документов, которые являются частью статистического семантического индексирования. Дополнительные сведения см. в разделе Семантический поиск (SQL Server).

[ , ... n ]

Указывает, что для предложений ADD, ALTER и DROP можно задать несколько столбцов. Если указано несколько столбцов, то эти столбцы следует разделить запятыми.

WITH NO POPULATION

Указывает, что полнотекстовый индекс не будет заполнен после операции ADD или DROP столбца или операции SET STOPLIST. Индекс заполняется только в том случае, если пользователь выполняет start... Команда POPULATION.

При указании NO POPULATION SQL Server не заполняет индекс. Индекс заполняется только после того, как пользователь выдает команду ALTER FULLTEXT INDEX...START POPULATION. Если параметр NO POPULATION не указан, SQL Server заполняет индекс.

Если состояние CHANGE_TRACKING включено и указано предложение WITH NO POPULATION, то SQL Server возвращает ошибку. Если CHANGE_TRACKING включена, а функция WITH NO POPULATION не указана, SQL Server выполняет полную популяцию индекса.

Примечание.

Дополнительные сведения см. в разделе Взаимодействие между отслеживанием изменений и параметром NO POPULATION.

{ADD | DROP } STATISTICAL_SEMANTICS

Применимо: SQL Server 2012 (11.x) и более поздних версий.

Включает или отключает статистическое семантическое индексирование для указанных столбцов. Дополнительные сведения см. в разделе Семантический поиск (SQL Server).

START { FULL | INCREMENTAL | UPDATE } POPULATION

Предписывает SQL Server начать заполнение полнотекстового индекса table_name. Если заполнение полнотекстового индекса уже выполняется, SQL Server возвращает предупреждение и не запускает новую популяцию.

  • FULL

    Указывает, что каждая строка таблицы извлекается для полнотекстового индексирования, даже если строки уже индексированы.

  • INCREMENTAL

    Указывает, что для полнотекстового индексирования извлекаются только измененные строки с момента получения последней совокупности. Аргумент INCREMENTAL можно использовать, только если в таблице есть столбец типа timestamp. Если таблица в полнотекстовом каталоге не содержит столбец метки времени типа, таблица проходит полную популяцию.

  • UPDATE

    Указывает обработку всех вставок, обновлений и удалений со времени последнего обновления индекса отслеживания изменений. Для таблицы необходимо включить отслеживание изменений, но индекс фонового обновления или автоматическое отслеживание изменений не должно быть включено.

{STOP | PAUSE | RESUME } POPULATION

Останавливает или приостанавливает процесс заполнения; либо останавливает или возобновляет приостановленное заполнение.

STOP POPULATION не останавливает автоматическое отслеживание изменений или индекс фонового обновления. Чтобы остановить отслеживание изменений, следует использовать команду SET CHANGE_TRACKING OFF.

Предложения PAUSE POPULATION и RESUME POPULATION могут использоваться только для полных заполнений. Они не относятся к другим типам популяций, так как другие популяции возобновляют обход, откуда остановлен обход.

SET STOPLIST { OFF | SYSTEM | stoplist_name }

Изменяет полнотекстовый список стоп-слов, связанный с индексом, если он есть.

  • ВЫКЛ.

    Указывает, что список стоп-слов не связан с полнотекстовый индекс.

  • SYSTEM

    Указывает, что для полнотекстового индекса должен использоваться системный полнотекстовый список стоп-слов.

  • stoplist_name

    Задает имя списка стоп-слов, который будет связан с полнотекстовым индексом.

Дополнительные сведения см. в разделе Настройка стоп-слов и списков стоп-слов для полнотекстового поиска и управление ими.

SET SEARCH PROPERTY LIST { OFF | property_list_name } [ WITH NO POPULATION ]

Применимо: SQL Server 2012 (11.x) и более поздних версий.

Изменяет список свойств поиска, связанный с индексом, если он есть.

  • ВЫКЛ.

    Указывает, что список свойств не связан с полнотекстовый индекс. Если отключить список свойств поиска полнотекстового индекса (ALTER FULLTEXT INDEX ... SET SEARCH PROPERTY LIST OFF), поиск свойств в базовой таблице больше не возможен.

    По умолчанию при отключении существующего списка свойств поиска автоматически производится повторное заполнение полнотекстового индекса. Если при отключении списка свойств поиска указать WITH NO POPULATION, автоматическое повторное заполнение не происходит. Однако рекомендуется выполнить полное заполнение этого полнотекстового индекса в удобное время. При повторном заполнении полнотекстового индекса удаляются относящиеся к свойствам метаданные для каждого удаленного свойства и индекс становится компактнее и эффективнее.

  • property_list_name

    Задает имя списка свойств поиска, который будет связан с полнотекстовым индексом.

    Добавление к полнотекстовому индексу списка свойств поиска требует повторного заполнения индекса, чтобы проиндексировать свойства поиска, зарегистрированные в этом списке. Если при добавлении списка свойств поиска указать WITH NO POPULATION, необходимо запустить популяцию в индексе в соответствующее время.

Важно!

Если полнотекстовый индекс был ранее связан с другим поиском, то потребуется перестроить список свойств, чтобы привести индекс в согласованное состояние. Этот индекс немедленно усекается и остается пустым до запуска полного заполнения. Дополнительные сведения см. в разделе Изменение списка свойств поиска приводит к перестроению индекса.

Примечание.

Один список свойств поиска может быть связан с несколькими полнотекстовыми индексами в той же базе данных.

Поиск списков свойств поиска в текущей базе данных

Дополнительные сведения о списках свойств поиска см. в статье Поиск свойств документа с использованием списков свойств поиска.

Замечания

Для столбцов xml можно создать полнотекстовый индекс, который индексирует содержимое XML-элементов, но пропускает XML-разметку. К значениям атрибута, если они не являются числовыми значениями, применяется полнотекстовый индекс. Теги элементов используются в качестве границ токенов. Поддерживаются XML- или HTML-документы и фрагменты правильного формата, содержащие несколько языков. Дополнительные сведения см. в разделе Использование полнотекстового поиска со столбцами XML.

Рекомендуется для ключевого столбца индекса использовать тип данных integer. Это позволяет проводить оптимизацию во время выполнения запроса.

ALTER FULLTEXT INDEX не может быть помещен в транзакцию пользователя. Эта инструкция должна выполняться в собственной неявной транзакции.

Дополнительные сведения о полнотекстовых индексах см. в разделе Создание полнотекстовых индексов и управление ими.

Взаимодействие с отслеживанием изменений и параметром NO POPULATION

Заполнение полнотекстового индекса зависит от того, включено ли отслеживание изменений и указано ли предложение WITH NO POPULATION в инструкции ALTER FULLTEXT INDEX. В следующей таблице описывается результат их взаимодействия.

Отслеживание изменений WITH NO POPULATION Результат
Не включено Не указано Выполняется полное заполнение полнотекстового индекса.
Не включено Задано Заполнение полнотекстового индекса не выполняется, если не выполнена инструкция ALTER FULLTEXT INDEX...START POPULATION.
Включен Задано Возникает ошибка, и индекс не изменяется.
Включен Не указано Выполняется полное заполнение полнотекстового индекса.

Дополнительные сведения о заполнении полнотекстовых индексов см. в разделе Заполнение полнотекстовых индексов.

Изменение списка свойств поиска приводит к перестроению индекса

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

Однако если связать полнотекстовый индекс с другим списком свойств, то он будет перестроен. При этом полнотекстовый индекс немедленно усекается (удаляются все существующие данные) и должен быть повторно заполнен. Пока заполнение не завершено, полнотекстовые запросы к базовой таблице будут находить только те строки, для которых уже прошло заполнение. Повторяемые данные индекса включают метаданные из зарегистрированных свойств только что добавленного списка свойств поиска.

Перестроение выполняется в следующих случаях:

  • Переключитесь непосредственно на другой список свойств поиска (см. раздел "Сценарий А", далее в этом разделе).

  • Отключите список свойств поиска, а затем свяжите индекс со списком свойств поиска (см. раздел "Сценарий B", далее в этом разделе).

Примечание.

Дополнительные сведения о работе полнотекстового поиска со списками свойств поиска см. в статье Поиск свойств документа с использованием списков свойств поиска. Сведения о полных заполнениях см. в разделе Заполнение полнотекстовых индексов.

Сценарий A. Переключение непосредственно на другой список свойств поиска

  1. Создан полнотекстовый индекс для таблицы table_1 со списком свойств поиска spl_1:

    CREATE FULLTEXT INDEX ON table_1 (column_name) KEY INDEX unique_key_index
        WITH SEARCH PROPERTY LIST=spl_1,
        CHANGE_TRACKING OFF, NO POPULATION;
    
  2. Выполняется полное заполнение для полнотекстового индекса:

    ALTER FULLTEXT INDEX ON table_1 START FULL POPULATION;
    
  3. Затем полнотекстовый индекс связывается с другим списком свойств поиска, spl_2, с помощью следующей инструкции:

    ALTER FULLTEXT INDEX ON table_1 SET SEARCH PROPERTY LIST spl_2;
    

    Эта инструкция вызывает полное заполнение — действие по умолчанию. Однако перед началом заполнения индекса средство полнотекстового поиска автоматически усекает его.

Сценарий Б. Отключение списка свойств поиска и последующее связывание индекса с любым списком свойств поиска

  1. Создан полнотекстовый индекс для таблицы table_1 со списком свойств поиска spl_1, после чего автоматически выполнено полное заполнение (действие по умолчанию):

    CREATE FULLTEXT INDEX ON table_1 (column_name) KEY INDEX unique_key_index
        WITH SEARCH PROPERTY LIST=spl_1;
    
  2. Отключается список свойств поиска, следующим образом.

    ALTER FULLTEXT INDEX ON table_1
        SET SEARCH PROPERTY LIST OFF WITH NO POPULATION;
    
  3. Полнотекстовый индекс снова связывается либо с тем же, либо с другим списком свойств поиска.

    Например, следующая инструкция пересоединяет полнотекстовый индекс с исходным списком свойств поиска: spl_1

    ALTER FULLTEXT INDEX ON table_1 SET SEARCH PROPERTY LIST spl_1;
    

    Эта инструкция запускает полное заполнение (действие по умолчанию).

    Примечание.

    Перестроение потребуется также и для другого списка свойств поиска — spl_2.

Разрешения

Пользователь должен иметь разрешение ALTER на таблицу или индексированное представление, быть членом предопределенной роли сервера sysadmin или предопределенной роли базы данных db_ddladmin или db_owner.

Если указано предложение SET STOPLIST, пользователь должен иметь разрешение REFERENCES на список стоп-слов. Если указано SET SEARCH PROPERTY LIST, то пользователь должен иметь разрешение REFERENCES для списка свойств поиска. Владелец указанного списка стоп-слов или списка свойств поиска может предоставить разрешение REFERENCES, если владелец имеет разрешения ALTER FULLTEXT CATALOG.

Примечание.

Любому пользователю предоставлено разрешение REFERENCES на список стоп-слов по умолчанию, поставляемый в составе SQL Server.

Примеры

А. Настройка отслеживания изменений вручную

В следующем примере вручную задается отслеживание изменений для полнотекстового индекса таблицы JobCandidate.

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate
   SET CHANGE_TRACKING MANUAL;
GO

B. Связывание списка свойств с полнотекстовый индекс

Применимо: SQL Server 2012 (11.x) и более поздних версий.

В следующем примере производится связывание списка свойств DocumentPropertyList с полнотекстовым индексом таблицы Production.Document. Эта инструкция ALTER FULLTEXT INDEX начинает полное заполнение — поведением по умолчанию для предложения SET SEARCH PROPERTY LIST.

Примечание.

Пример создания такого списка свойств DocumentPropertyList см. в разделе CREATE SEARCH PROPERTY LIST (Transact-SQL).

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON Production.Document
   SET SEARCH PROPERTY LIST DocumentPropertyList;
GO

C. Удаление списка свойств поиска

Применимо: SQL Server 2012 (11.x) и более поздних версий.

В следующем примере производится удаление списка свойств DocumentPropertyList из полнотекстового индекса для таблицы Production.Document. В этом примере нет спешки удалить свойства из индекса, поэтому указан параметр WITH NO POPULATION. Однако поиск с использованием свойств выполняется дольше, чем поиск с полнотекстовым индексом.

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON Production.Document
   SET SEARCH PROPERTY LIST OFF WITH NO POPULATION;
GO

D. Начало полной совокупности

В следующем примере запускается выполнение полного заполнения полнотекстового индекса в таблице JobCandidate.

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate
   START FULL POPULATION;
GO

См. также