CREATE FULLTEXT INDEX (Transact-SQL)

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

Полнотекстовый индекс может содержать не более 1024 столбцов.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

CREATE FULLTEXT INDEX ON table_name
   [ ( { column_name 
             [ TYPE COLUMN type_column_name ]
             [ LANGUAGE language_term ] 
        } [ ,...n] 
      ) ]
    KEY INDEX index_name 
    [ ON <catalog_filegroup_option> ]
    [ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]
[;]

<catalog_filegroup_option>::=
 {
    fulltext_catalog_name 
 | ( fulltext_catalog_name, FILEGROUP filegroup_name )
 | ( FILEGROUP filegroup_name, fulltext_catalog_name )
 | ( FILEGROUP filegroup_name )
 }

<with_option>::=
 {
   CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } 
 | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
 }

Аргументы

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

  • column_name
    Имя столбца, включенного в полнотекстовый индекс. Индексировать для полнотекстового поиска можно только столбцы типов char, varchar, nchar, nvarchar, text, ntext, image, xml и varbinary(max). Чтобы задать несколько столбцов, предложение column_name повторяется следующим образом:

    CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …

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

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

    ПримечаниеПримечание

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

  • LANGUAGE language_term
    Язык данных, хранящихся в столбце column_name.

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

    Если аргумент language_term указан, представленный им язык будет использоваться при индексировании данных, хранящихся в столбцах типов char, nchar, varchar, nvarchar, text и ntext. Этот язык используется в запросах по умолчанию, если аргумент language_term не задан как часть полнотекстового предиката, характеризующего столбец.

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

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

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

    Для доступа к данным о языке полнотекстового поиска по умолчанию экземпляра Microsoft SQL Server следует использовать хранимую процедуру sp_configure. Дополнительные сведения см. в разделах sp_configure (Transact-SQL) и Параметр default full-text language.

    Для столбцов с типами, отличными от BLOB и XML, содержащих текстовые данные на нескольких языках, или в случаях, когда язык хранящегося в столбце текста неизвестен, лучше использовать нейтральный (0x0) языковой ресурс. Однако следует осознавать возможные последствия использования нейтрального языкового ресурса (0x0). Информацию о возможных решениях и последствиях использования нейтрального языкового ресурса (0x0) см. в разделе Рекомендации по выбору языка при создании полнотекстового индекса.

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

  • KEY INDEX index_name
    Имя индекса уникальных ключей таблицы table_name. Индекс KEY INDEX должен быть уникальным столбцом с одним ключом, не допускающим значения NULL. Выбрать минимально возможный индекс ключа для полнотекстового уникального ключа. Для оптимальной производительности рекомендуется использовать для полнотекстовых ключей тип данных integer.

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

  • FILEGROUP filegroup_name
    Создает указанный полнотекстовый индекс в указанной файловой группе. Файловая группа должна существовать. Если предложение FILEGROUP не задано, полнотекстовый индекс помещается для несекционированной таблицы в ту же файловую группу, что и базовая таблица и представление, для секционированной таблицы — в первичную файловую группу.

  • CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
    Указывает, будет ли SQL Server распространять на полнотекстовый индекс изменения (обновления, удаления или вставки), выполненные в столбцах таблицы, которые включены в полнотекстовый индекс. Изменения данных, внесенные с помощью инструкций WRITETEXT и UPDATETEXT, не отражаются в полнотекстовом индексе и не отмечаются при отслеживании изменений.

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

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

    • OFF [ , NO POPULATION]
      Указывает, что в SQL Server не хранится список изменений индексированных данных. Если аргумент NO POPULATION не указан, SQL Server заполняет индекс полностью, после того как он был создан.

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

  • STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
    Связывает полнотекстовый список стоп-слов с индексом. Индекс не заполняется токенами, которые являются частью указанного списка стоп-слов. Если список STOPLIST не указан, SQL Server связывает с индексом системный полнотекстовый список стоп-слов.

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

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

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

Замечания

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

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

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

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

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

Отслеживание изменений

WITH NO POPULATION

Результат

Не включено

Не указано

Выполняется полное заполнение полнотекстового индекса.

Не включено

Указано

Заполнение полнотекстового индекса не выполняется, если не выполнена инструкция ALTER FULLTEXT INDEX...START POPULATION.

Включено

Указано

Формируется ошибка. Индекс не изменяется.

Включено

Не указано

Выполняется полное заполнение полнотекстового индекса.

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

Разрешения

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

Если указана инструкция SET STOPLIST, пользователь должен иметь разрешение REFERENCES на указанный список стоп-слов. Это разрешение может быть предоставлено владельцем списка стоп-слов.

ПримечаниеПримечание

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

Примеры

А. Создание уникального индекса, полнотекстового каталога, а также полнотекстового индекса

В следующем примере создается уникальный индекс по столбцу JobCandidateID таблицы HumanResources.JobCandidate образца базы данных AdventureWorks2008R2. Затем пример создает полнотекстовый каталог по умолчанию, ft. Наконец, пример создает полнотекстовый индекс по столбцу Resume с использованием каталога ft и системного списка стоп-слов.

USE AdventureWorks2008R2;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) 
   KEY INDEX ui_ukJobCand 
   WITH STOPLIST = SYSTEM;
GO

Б. Создание полнотекстового индекса для нескольких столбцов таблицы

В следующем примере создается полнотекстовый индекс по столбцам ReviewerName, EmailAddress и Comments таблицы Production.ProductReview образца базы данных AdventureWorks2008R2. Для каждого столбца в примере указывается код английского языка, 1033, который является языком данных в столбцах. Этот полнотекстовый индекс использует полнотекстовый каталог по умолчанию и существующий индекс уникального ключа, PK_ProductReview_ProductReviewID. Согласно рекомендациям, этот ключ индекса находится в целочисленном столбце ProductReviewID.

USE AdventureWorks2008R2;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview
( 
  ReviewerName
     Language 1033,
  EmailAddress
     Language 1033,
  Comments 
     Language 1033     
 ) 
KEY INDEX PK_ProductReview_ProductReviewID ; 
GO

В. Создание полнотекстового индекса без заполнения

В следующем примере создается полнотекстовый каталог, documents_catalog, в образце базы данных AdventureWorks2008R2. Следующий пример создает полнотекстовый индекс, который использует этот новый каталог. Полнотекстовый индекс построен для столбцов Title, DocumentSummary и Document таблицы Production.Document. В примере для каждого столбца указан код для английского языка, 1033, который является языком данных в столбцах. Этот полнотекстовый индекс использует полнотекстовый каталог по умолчанию и существующий индекс уникального ключа — PK_Document_DocumentID. Согласно рекомендациям, этот ключ индекса находится в целочисленном столбце DocumentID.

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

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

USE AdventureWorks2008R2;
GO
CREATE FULLTEXT CATALOG documents_catalog;
GO
CREATE FULLTEXT INDEX ON Production.Document
  ( 
  Title
      Language 1033, 
  DocumentSummary
      Language 1033, 
  Document 
      TYPE COLUMN FileExtension
      Language 1033 
  )
  KEY INDEX PK_Document_DocumentID
      ON documents_catalog
      WITH STOPLIST = SYSTEM , CHANGE_TRACKING OFF, NO POPULATION;
   GO

Позже, в часы с наименьшей загрузкой, выполняется заполнение индекса:

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO