Приступая к работе с компонентом Full-Text Search

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

Для этого необходимо выполнить следующие основные шаги.

  1. Создание полнотекстового каталога для хранения полнотекстовых индексов.

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

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

    Начиная с версии SQL Server 2008 полнотекстовый каталог является виртуальным объектом и не входит в файловую группу. Полнотекстовый каталог — это логическое понятие, обозначающее группу полнотекстовых индексов.

  2. Создание полнотекстового индекса по таблице или индексированному представлению.

    Полнотекстовый индекс — это специальный тип функционального индекса на основе токенов, создаваемый и используемый средством полнотекстового поиска. Чтобы полнотекстовый поиск мог быть создан для таблиц или представлений, они должны иметь уникальный индекс, который включает один столбец и не допускает значений NULL. Этот уникальный индекс необходим средству полнотекстового для сопоставления каждой строки таблицы с уникальным ключом со сжатием. Полнотекстовый индекс может включать только столбцы следующих типов: char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary и varbinary(max). Дополнительные сведения см. в разделе Общие сведения о полнотекстовом индексировании.

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

Полнотекстовые индексы

Обычные индексы SQL Server

Для одной таблицы разрешен только один полнотекстовой индекс.

Для одной таблицы разрешено несколько обычных индексов.

Добавление данных к полнотекстовым индексам (заполнение) может быть запрошено явно, выполняться по расписанию либо автоматически при добавлении новых данных в базу.

Обновляются автоматически при создании, вставке, обновлении или удалении данных, на которых они созданы.

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

Не группируются.

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

В данном разделе объясняется следующее.

  • Выбор языка столбца.

  • Выбор файловой группы для полнотекстового индекса.

  • Назначение полнотекстового индекса для полнотекстового каталога.

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

  • Обновление полнотекстового индекса.

Выбор языка столбца

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

Выбор файловой группы для полнотекстового индекса

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

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

Назначение полнотекстового индекса для полнотекстового каталога

Важно распланировать расположение полнотекстовых индексов для таблиц в полнотекстовых каталогах.

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

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

  • Для полнотекстового уникального ключа всегда следует выбирать наименьший по размеру уникальный индекс. (Оптимален четырехбайтовый индекс на основе целочисленных значений.) Это значительно снизит потребление ресурсов, необходимых службе поиска Майкрософт для работы с файловой системой. Если первичный ключ велик (более 100 байт), попробуйте выбрать в таблице другой уникальный индекс (или создайте другой уникальный индекс) в качестве полнотекстового уникального ключа. В противном случае, если размер полнотекстового уникального ключа превышает максимально разрешенный размер (900 байт), выполнить полнотекстовое заполнение не удастся.

  • Если индексируется таблица с миллионами строк, припишите ее к отдельному полнотекстовому каталогу.

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

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

В SQL Server 2008 были добавлены списки стоп-слов. Список стоп-слов — это список, в котором перечислены стоп-слова, также известные как пропускаемые слова. Список стоп-слов связывается с каждым полнотекстовым индексом. Слова в данном списке применяются к полнотекстовым запросам в данном индексе. По умолчанию с новым полнотекстовым индексом связан системный список стоп-слов. Однако пользователь может создать и использовать собственный список стоп-слов. Дополнительные сведения см. в разделе Стоп-слова и списки стоп-слов.

Например, приведенная ниже инструкция Transact-SQLCREATE FULLTEXT STOPLIST создает новый список полнотекстовых стоп-слов с именем myStoplist3 путем копирования из системного списка стоп-слов:

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO

Приведенная ниже инструкция Transact-SQLALTER FULLTEXT STOPLIST изменяет список стоп-слов myStoplist путем добавления слова «en» для испанского и затем французского языков.

ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO

Обновление полнотекстового индекса

Аналогично обычным индексам SQL Server полнотекстовые индексы можно обновлять автоматически по мере изменения данных в связанных с ними таблицах. Это поведение по умолчанию. Также обновлять полнотекстовые индексы можно вручную либо по заданному расписанию. Заполнение полнотекстового индекса может потребовать значительного времени и ресурсов, вследствие чего обновление индекса обычно выполняется как асинхронный процесс в фоновом режиме, который обновляет полнотекстовый индекс после внесения изменений в базовую таблицу. Для немедленного обновления полнотекстового индекса после каждого изменения в базовой таблице может потребоваться большой объем ресурсов. Следовательно, если обновление, вставка или удаление выполняются часто, то производительность запросов может снизиться. В таком случае попробуйте выполнять обновления отслеживания изменений вручную по определенному расписанию. Это позволит обрабатывать больше изменений в определенные моменты времени, а не конкурировать за ресурсы с запросами.

Чтобы наблюдения за состоянием заполнения используется функция FULLTEXTCATALOGPROPERTY или OBJECTPROPERTYEX. Чтобы получить сведения о состоянии заполнения каталога, выполните следующую инструкцию:

SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');

Как правило, если выполняется полное заполнение, возвращается значение 1.

Пример. Настройка полнотекстового поиска (Transact-SQL)

В следующем примере, состоящем из двух частей, создается полнотекстовый каталог с именем AdvWksDocFTCat в базе данных AdventureWorks2008R2, а затем создается полнотекстовый индекс в таблице Document базы данных База данных AdventureWorks2008R2. Эта инструкция создает полнотекстовый каталог в папке по умолчанию, указанной во время установки, то есть папка AdvWksDocFTCat будет вложена в каталог по умолчанию.

  1. Для создания полнотекстового каталога AdvWksDocFTCat в примере используется инструкция CREATE FULLTEXT CATALOG:

    USE AdventureWorks2008R2;
    GO
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;
    
  2. Однако перед созданием полнотекстового индекса для таблицы Document следует убедиться, что в ней определен уникальный индекс с одним столбцом, не допускающий значений NULL. Следующая инструкция CREATE INDEX создает уникальный индекс ui_ukDoc на столбце DocumentID таблицы Document:

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
    
  3. После создания уникального ключа можно создать полнотекстовый индекс для таблицы Document с помощью следующей инструкции CREATE FULLTEXT INDEX.

    CREATE FULLTEXT INDEX ON Production.Document
    (
        Document                         --Full-text index column name 
            TYPE COLUMN FileExtension    --Name of column that contains file type information
            Language 2057                 --2057 is the LCID for British English
    )
    KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index
    WITH CHANGE_TRACKING AUTO            --Population type;
    GO
    

    Столбец TYPE COLUMN, определенный в этом примере, задает столбец типов в таблице, которая в каждой строке столбца «Document» (имеющего двоичный тип) содержит тип документа. Столбец типа хранит заданное пользователем расширение файла документа — DOC, XLS и т. д. — в данной строке. Средство полнотекстового поиска будет использовать это расширение для вызова соответствующего фильтра, который применяется для синтаксического анализа данных в данной строке. После того как фильтр выполнит синтаксический анализ двоичных данных в строке, указанное средство разбиения по словам выполнит синтаксический анализ содержимого (в данном примере используется средство разбиения по словам для английского языка (Великобритания)). Следует отметить, что процесс фильтрации выполняется либо во время индексирования, либо при вставке или обновлении пользователем столбца в базовой таблице, если автоматическое отслеживание изменений было включено для полнотекстового индекса. Дополнительные сведения см. в разделе Фильтры полнотекстового поиска.

Просмотр сведений о полнотекстовом индексе

Каталог или динамическое административное представление

Описание

sys.fulltext_index_catalog_usages (Transact-SQL)

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

sys.fulltext_index_columns (Transact-SQL)

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

sys.fulltext_index_fragments (Transact-SQL)

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

sys.fulltext_indexes (Transact-SQL)

Содержит по одной строке для каждого полнотекстового индекса табличного объекта.

sys.dm_fts_index_keywords (Transact-SQL)

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

sys.dm_fts_index_keywords_by_document (Transact-SQL)

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

sys.dm_fts_index_population (Transact-SQL)

Возвращает сведения о выполняющихся в настоящий момент процессах заполнения полнотекстовых индексов.