Главная » Microsoft SQL Server, Базы данных » Конфигурирование каталогов полнотекстового поиска

0

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

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

Создание каталога с помощью мастера

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

Этот мастер запускается в окне Object Explorer утилиты Management Studio. Для этого нужно выделить соответствующую таблицу и в ее контекстном меню выбрать команду Full- Text Index^Define Full-Text Index.

При конфигурировании каталога полнотекстового поиска мастер проходит несколько этапов.

1.              Выберите базу данных, которой будет принадлежать каталог.

2.              Выделите таблицу для включения в каталог.

3.              Задайте уникальный индекс, который будет использовать механизм полнотекстового поиска. Как правило, для такого индекса лучше использовать первичный ключ, однако иногда оказывается достаточно и индекса по одному столбцу, если он не содержит пустых и дублирующихся значений. Если таблица использует составной первичный ключ, то для полнотекстового поиска можно использовать другой уникальный индекс.

4.              Выделите столбцы, которые будут использоваться для индекса (рис. 13.1), при этом можно использовать данные любых символьных типов (char, nchar, varchar, nvarchar, text, ntext и xml), а также двоичные изображения (image) (об индексировании двоичных данных речь пойдет в последнем разделе этой главы). Также нужно выбрать язык для сканирования слов, хотя компьютер по умолчанию может автоматически справиться и с этой задачей.

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

Полнотекстовый поиск может читать документы, сохраненные в столбцах с типом данных image. Использование полнотекстового поиска с особо большими двоичными объектами мы обсудим в одном из следующих разделов.

1.              Желательно установить отслеживание изменений; при этом любые изменения в данных будут сразу же отражаться в каталоге. Если не включать отслеживание изменений, то обновление каталога придется выполнять вручную.

2.              Выберите существующий каталог или создайте новый.

3.              Не создавайте расписание заполнения каталога: существуют лучшие способы поддержания его в обновленном состоянии. (О стратегиях поддержания полнотекстового индекса мы поговорим немного позже в этой главе.)

4.              Завершите работу мастера.

Когда работа мастера завершится, каталог будет создан, но пока останется пустым. Для изначального заполнения каталога щелкните правой кнопкой мыши на таблице и выберите в контекстном меню пункт Full-Text Index Table^Enable Full-Text Index, а затем Full-Text Index Table^Start Full Population. SQL Server начнет передавать данные службе полнотекстового поиска для индексации. В зависимости от объема данных в индексируемых столбцах процесс заполнения каталога может продолжаться как несколько секунд, так и несколько часов.

Создание каталога на языке T-SQL

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

1.              Откройте базу данных, в которой нужно сконфигурировать полнотекстовый поиск:

USE AESOP

EXEC sp_fulltext_database ‘enable’

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

2.              Создайте полнотекстовый каталог:

EXEC sp_fulltext_catalog ‘AesopFable’, ‘create’

3.              Выберите таблицу для полнотекстового поиска:

EXEC sp_fulltext_table

‘Fable’, ‘create’, ‘AesopFable’, ‘FablePK’

4.              Добавьте в полнотекстовый каталог столбцы:

EXEC sp_fulltext_column ‘Fable’, ‘Title’, ‘add’

EXEC sp_fulltext_column ‘Fable’, ‘Moral1, ‘add’

EXEC sp_fulltext_column ‘Fable’, ‘FableText’, ‘add’

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

sp_fulltext_column @tabname =’имя_ та блицы’,

@colname =’имя_столбца’ ,

@action = ‘действие’,

@language = ‘язык1,

@type_colname =1тип_имени_столбца1

Параметр действие может принимать значение ‘ add’ или ‘ drop1. Полнотекстовый поиск автоматически сканирует информацию на следующих языках.

Нейтральный — 0                                           Японский — 0x0411,1041

Упрощенный китайский — 0x804, 2052          Корейский — 0x412,1042

Традиционный китайский — 0x0404,1028 Современный испанский — ОхОсОа, 3082 Датский — 0x0413,1043         Шведский — 0x041 d, 1053

Английский (Великобритания) — 0x0809, 2057 Тайский Английский (США) — 0x0409,1033        Китайский (Гонконг)

Французский — 0x040с, 1036                        Китайский (Макао)

Немецкий — 0x0407,1031                              Китайский (Сингапур)

Итальянский — 0x410,1040

Выбор языка определяет правила переноса слов, а также их видоизмененные формы. Если в базе данных использовано несколько языков или неподдерживаемый язык, выбирайте нейтральный. Поддерживаемый шестнадцатеричный код передается параметру системной хранимой процедуры sp_fulltext_columns. Все столбцы таблицы должны использовать один и тот же язык.

5.              Активизируйте полнотекстовый каталог:

EXEC sp_fulltext_table 1 Fable 1, ‘activate 1

Несмотря на то что полнотекстовый каталог создан, он пока еще не заполнен. Для его заполнения запустите следующую хранимую процедуру:

EXEC sp_fulltext_table ‘Fable’, ‘start_full’

Помещение данных в полнотекстовый индекс

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

Любой полнотекстовый индекс создается пустым, и если в таблицах SQL Server содержатся данные, то они должны быть вытолкнуты в индекс посредством полного заполнения. Полное заполнение заново инициализирует индекс и заполняет его данными обо всех строках. Полное заполнение можно выполнить как программным путем, так и в утилите Management Studio. Так как выталкивание данных управляется сервером, одновременно службе полнотекстового поиска отсылается только одна таблица, независимо от того, сколько их должно быть проиндексировано в каталоге. Если полнотекстовый индекс создается для пустой таблицы, то полное заполнение не требуется.

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

?               Постепенное заполнение. Постепенное заполнение использует время создания для выявления строк, созданных после последнего заполнения. Этот метод можно использовать в утилите Management Studio, в программном коде Т-SQL, а также в заданиях агента SQL Server Agent (обычно такие задания планируются на вечернее время). Для последовательного заполнения требуется наличие в таблице столбца типа timestamp.

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

?               Отслеживание изменений и фоновое заполнение. SQL Server может отслеживать изменения данных в столбцах, по которым созданы полнотекстовые индексы. Как только изменение обнаружено в некоторой строке, индекс будет обновлен только по ней. Несмотря на то что этот метод также расходует ресурсы компьютера, на практике эффект от его использования почти не заметен. Полнотекстовое обновление не вызывается триггером, так что транзакциям обновления не приходится ждать, пока данные будут вытолкнуты в полнотекстовый индекс. Вместо этого обновление полнотекстового индекса выполняется в фоновом режиме практически сразу же после транзакции SQL DML. В результате загрузка процессора балансируется, и индексация происходит практически в режиме реального времени.

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

Обслуживание каталога в Management Studio

В утилите Management Studio полнотекстовый поиск выполняется с помощью щелчка правой кнопкой мыши и выбора команды в контекстном меню каждой таблицы. Все команды обслуживания полнотекстового поиска собраны в подменю Full-Text Index Table.

?               Define Full-Text Indexing on Table. Запуск мастера полнотекстовой индексации так, как было описано выше в этой главе.

?               Edit Full-Text Indexing. Запускает мастера полнотекстовой индексации для изменения каталога выделенной таблицы.

?               Remove Full-Text Indexing from a Table. Удаляет выделенную таблицу из ее каталога.

?               Start Full Population. Инициирует заполнение данных из всех строк выделенной таблицы в каталог полнотекстовой индексации.

?               Start Incremental Population. Инициирует заполнение всех данных, измененных после последнего заполнения полнотекстового индекса.

?               Stop Population. Останавливает любой текущий процесс заполнения.

?               Change Tracking. Выполняет полное или постепенное заполнение, после чего включает отслеживание изменений данных для обновления индексов.

?               Update Index in Background. Запускает процесс обновления строк, отмеченных отслеживанием изменения данных.

?               Update Index. Запускает обновления всех строк, отмеченных отслеживанием изменений, в полнотекстовом индексе.

Обслуживание каталога в программном коде T-SQL

Все перечисленные выше команды меню утилиты Management Studio можно выполнить и программным путем. Приведенные ниже фрагменты демонстрируют использование команд управления каталогом на примере учебной базы данных басен Эзопа.

?               Полное заполнение.

EXEC sp_fulltext_table 1 Fable’, ‘start_full’

?               Постепенное заполнение.

EXEC sp_fulltext_table ‘Fable1, ‘start_incremental1

?               Удаление полнотекстового каталога.

EXEC sp_fulltext_table ‘AesopFable1, ‘drop’

?               Отслеживание изменений и фоновое обновление.

EXEC sp_fulltext_table Fable, ‘Start_change_tracking’

EXEC sp_fulltext_table Fable,

‘Start_background_updateindex’

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

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

EXEC sp_fulltext_catalog ‘AesopFable’, ‘rebuild’

?               Очистка неиспользуемых полнотекстовых каталогов. Следующая команда очищает неиспользуемые полнотекстовые каталоги:

EXEC sp_fulltext_service ‘clean__up’

Начиная с версии SQL Server 2000 хранимая процедура sp_help обеспечивает пользователей информационной справочной поддержкой. Версии этой процедуры следующие.

?               sp_help_fulltext_catalogs. Эта системная хранимая процедура возвращает информацию о каталоге, включая статус текущего заполнения.

EXEC sp_help_fulltext_catalogs ‘AesopFable’

Результат выполнения этой процедуры следующий:

NUMBER

FULLTEXT

ftcatid NAME            PATH                             STATUS TABLES

5        AesopFable C:\Program Files                   0           1

\Microsoft SQL Server \MSSQL\FTDATA

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

•                0 — нет активности

•                1 — идет полное заполнение

•                2 — заполнение приостановлено

•                3 — перегрузка

•                4 — восстановление

•                5 — закрыт

•                6 — идет постепенное наполнение

•                7 — создание индекса

•                8 — диск полон, работа приостановлена

•                9 — отслеживание изменений

?               sp_help_fulltext_tables. Этот вариант хранимой процедуры возвращает информацию о таблицах, занесенных в каталог.

EXEC sp_help_fulltext_tables ‘AesopFable’

Результат (форматированный):

FULLTEXT

KEY   FULLTEXT FULLTEXT FULLTEXT

TABLE TABLE INDEX KEY          INDEX       CATALOG

OWNER NAME NAME                  COLID      ACTIVE NAME

dbo Fable FablePK 1                       1                AesopFable

?               sp_help_fulltext_columns. Возвращает информацию о столбцах, включенных в каталог.

EXEC sp_help_fulltext_columns ‘fable’

Результат (форматированный и сокращенный):

TABLE_ FULLTEXT BLOBTP

OWNER NAME COLUMNNAME COLNAME LANGUAGE

dbo Fable Title                  NULL        1033

dbo Fable Moral                NULL        1033

dbo Fable FableText NULL                 1033

Файлы шумов

Когда несколько лет назад я писал процедуру поиска слов, то с целью оптимизации и повышения производительности исключил такие слова, как a, the и of. Как только слово было просканировано, я проверял его наличие в “черном списке” и в случае получения положительного результата переходил к следующему слову. Таким образом, время сканирования обычных сайтов сократилось более чем вдвое, а таблица частоты слов стала значительно короче.

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

Решение включать слово в файл шума принимается на основании частоты его использования и относительной важности. Если слово распространенное, то оно будет часто встречаться в тексте и тем самым снижать общую производительность сервера. По этой причине такие слова лучше включать в файл шума.

В качестве альтернативы можно выполнять поиск и в файле шума. Например, если для базы данных важно определение “язык С”, букву “С” следует удалить из файла шума.

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

C:\Program Files\Microsoft SQL Server\MSSQL\FTDATA\noiseENU.txt

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

Server: Msg 7619, Level 16, State 1, Line 1 A clause of the query contained only ignored words

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии