Поделиться через


CREATE FULLTEXT INDEX (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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
 }

Аргументы

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) или документа изображения . Этот столбец называется столбцом типа и содержит указываемое пользователем расширение файла (.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 соответствует значению столбца псевдонима в системной sys.syslanguages таблице. Строка должна быть заключена в одиночные кавычки: 'language_term'. Если значением аргумента language_term является целое число, оно представляет собой действительный код языка. При указании в виде шестнадцатеричного значения language_term 0x следует шестнадцатеричное значение LCID. Длина шестнадцатеричного значения не должна превышать восьми цифр, включая ведущие нули.

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

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

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

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

Для документов, хранящихся в столбцах типа XML или BLOB, кодирование языка в документе используется во время индексирования. Например, в XML-столбцах атрибут в XML-документах xml:lang определяет язык. Во время запроса значение, ранее указанное для аргумента 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

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

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

    Указывает, что отслеживаемые изменения распространяются автоматически по мере изменения данных в базовой таблице (автоматическое заполнение). Изменения могут распространяться автоматически, однако это не значит, что они будут немедленно отражаться в полнотекстовом индексе. Аргумент 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 связывает системный полнотекстовый список стоп-слов с индексом.

  • ВЫКЛ.

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

  • SYSTEM

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

  • stoplist_name

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

SEARCH PROPERTY LIST [ = ] property_list_name

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

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

  • ВЫКЛ.

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

  • property_list_name

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

Замечания

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

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

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

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

Взаимодействие с отслеживанием изменений и параметром 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 таблицы примера базы данных AdventureWorks2022. Затем пример создает полнотекстовый каталог по умолчанию, 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

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

В следующем примере создается полнотекстовый каталог, production_catalog, в образце базы данных AdventureWorks. Следующий пример создает полнотекстовый индекс, который использует этот новый каталог. Полнотекстовый индекс находится в ReviewerNameEmailAddressComments столбцах и 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

См. также