CREATE FULLTEXT INDEX (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure

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

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

Синтаксис

CREATE FULLTEXT INDEX ON table_name  
   [ ( { column_name   
             [ TYPE COLUMN type_column_name ]  
             [ LANGUAGE language_term ]   
             [ STATISTICAL_SEMANTICS ]  
        } [ ,...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 }  
 | SEARCH PROPERTY LIST [ = ] property_list_name   
 }  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

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).

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

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

STATISTICAL_SEMANTICS
Применимо к: SQL Server (SQL Server 2012 (11.x) и выше)

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

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
Указывает, что отслеживаемые изменения должны распространяться вручную путем вызова инструкции ALTER FULLTEXT INDEX … Инструкция START UPDATE POPULATION Transact-SQL (заполнение вручную). Агент 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
Задает имя списка стоп-слов, который будет связан с полнотекстовым индексом.

SEARCH PROPERTY LIST [ = ] property_list_name
Применимо к: SQL Server (SQL Server 2012 (11.x) и выше)

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

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

property_list_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.

Примеры

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

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

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  

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

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

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

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

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

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

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

CREATE FULLTEXT INDEX ON Production.Document  
  (   
  Title  
      Language 1033,   
  DocumentSummary  
      Language 1033,   
  Document   
      TYPE COLUMN FileExtension  
      Language 1033   
  )  
  KEY INDEX PK_Document_DocumentID  
          WITH STOPLIST = SYSTEM, SEARCH PROPERTY LIST = DocumentPropertyList, CHANGE_TRACKING OFF, NO POPULATION;  
   GO  

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

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

См. также

Создание и управление полнотекстовыми индексами
ALTER FULLTEXT INDEX (Transact-SQL)
DROP FULLTEXT INDEX (Transact-SQL)
Компонент Full-text Search
GRANT (Transact-SQL)
sys.fulltext_indexes (Transact-SQL)
Поиск свойств документа с помощью списков свойств поиска