CREATE FULLTEXT INDEX (Transact-SQL)
Создает полнотекстовый индекс по таблице или индексированному представлению в базе данных. Для таблицы или индексированного представления допускается только один полнотекстовый индекс, а каждый полнотекстовый индекс применяется только к одной таблице или индексированному представлению.
Полнотекстовый индекс может содержать не более 1024 столбцов.
Синтаксис
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
См. также