SQL Server впервые представил средства полнотекстового поиска (Full-Text Search - FTS) в выпуске SQL Server 7.0. С тех пор FTS претерпел несколько улучшений и изменений, которые сделали его быстрее, мощнее, более гибким и легче в конфигурации и реализации, чем когда-либо ранее. Новейшая версия SQL Server FTS, известна под названием интегрированного полнотекстового поиска (Integrated Full-Text Search - iFTS), представляет собой инструмент для эффективного выполнения лингвистического поиска в широком диапазоне документов и других данных, хранящихся в базе SQL Server.

В этой статье я обсужу несколько аспектов SQL Server 2008 iFTS, включая следующие:

  • создание полнотекстовых каталогов и полнотекстовых индексов;
  • использование предикатов FREETEXT, CONTAINS и функций FREETEXTTABLE И CONTAINSTABLE для выполнения полнотекстового поиска в документах, данных XML и текстовых столбцах
  • использование расширенных опций iFTS, включая:
  • сложные поисковые выражения с использованием логических операторов AND, OR и AND NOT;
  • флективные (изменяемые) формы и поиск синонимов по тезаурусу с использованием FORMSOF;
  • поиск с зазором при помощи NEAR;
  • весовой поиск с использованием условия ISABOUT;
  • использование стоп-списков;
  • новые хранимые процедуры, представления каталога и функции динамического управления для облегчения администрирования iFTS

Архитектура SQL Server iFTS существенно изменилась по сравнению с предыдущими версиями FTS. В предшествующих версиях SQL Server FTS был реализован в виде отдельных процессов - как в механизме службы полнотекстового поиска SQL Server 2005 MSFTESQL.EXE. Программа MSFTESQL.EXE предоставляла большой набор функциональности полнотекстового поиска, решая такие задачи, как полнотекстовая индексация, обработка полнотекстовых запросов и управление демоном фильтрации.
В SQL Server 2008 избавились от MSFTESQL.EXE, передав ее функциональность непосредственно SQLSERVER.EXE. SQL Server 2008 включает процесс-демон фильтрации FDHOST.EXE, который пришел на смену MSFTEFD.EXE из SQL Server 2005. Эти два процесса взаимодействуют друг с другом и с механизмом запросов SQL Server, обеспечивая функциональность iFTS. Процесс SQL Server 2008 (SQLSERVER.EXE) содержит пять главных компонентов iFTS:

  1. полнотекстовый запрос;
  2. собиратель (Gatherer);
  3. индексатор;
  4. процессор механизма полнотекстовых запросов;
  5. диспетчер процесса демона фильтрации.

Хост-процесс демона фильтрации (FDHOST.EXE) состоит из двух главных компонентов: фильтров и разделителей слов. Этот новый уровень интеграции с механизмом запросов SQL Server обещает сделать iFTS более эффективным и простым в управлении и администрировании, чем предыдущие итерации SQL Server FTS.
Прежде чем можн будет воспользоваться преимуществами средств поиска iFTS, потребуется создать полнотекстовый каталог и один или более полнотекстовых индексо.

Используя Management Studio, вы можете легко создавать полнотекстовые каталоги и полнотекстовые индексы.
Чтобы создать полнотекстовый каталог, разверните узел Storage (Хранилище) в Object Explorer под целевой базой данных, выполните щелчок правой кнопкой мыши на узле Full Text Catalogs (Полнотекстовые каталоги) и выберите пункт New Full-Text Catalog (Новый полнотекстовый каталог) в контекстном меню. Появится диалоговое окно New Full-Text Catalog (Новый полнотекстовый каталог). В нем вы указываете имя для нового полнотекстового каталога, его владельца и установки чувствительности к ударению, а также то, будет ли данный полнотекстовый каталог вашим полнотекстовым каталогом по умолчанию. Установка чувствительности к ударению определяет, будет ли iFTS различать символы со знаком ударения и без.
Часто бывает необходимо запрограммировать в сценарии создание полнотекстового каталога и полнотекстового индекса. Существует много причин для автоматизации создания полнотекстового каталога и индекса.
Чтобы создать тот же полнотекстовый индекс, что и в примере из предыдущего слайда, используйте следующий оператор CREATE FULLTEXT CATALOG:

 

 

 

CREATE FULLTEXT CATALOG
AWftsCatalog
ON FILEGROUP [PRIMARY]
WITH ACCENT_SENSITIVITY = ON
AUTHORIZATION [dbo];

 

 
Оператор CREATE FILLTEXT CATALOG специфицирует имя полнотекстового каталога, которое должно быть уникальным среди имен полнотекстовых каталогов в текущей базе данных. Этот пример указывает, что полнотекстовый каталог будет создан на ��руппе файлов PRIMARY, чувствительность к ударению будет включена, а владельцем будет dbo (с помощью AUTHORIZATION). Мы создаем полнотекстовый каталог на группе файлов PRIMARY, потому что база данных Adventure Works имеет только одну группу файлов по умолчанию. В рабочей среде Microsoft рекомендует создавать дополнительные группы файлов специально для полнотекстовых каталогов.

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

После того, как вы создали ваш полнотекстовый каталог, наступает момент для определения одного или более полнотекстовых индексов на таблицах вашей базы данных.
Management Studio включает интерактивный мастер Full-Text Indexing Wizard, который проведит по всем этапам создания полнотекстового индекса. Для активизации мастера выполните следующие шаги.

 

  1. Выполните щелчок правой кнопкой мыши в Object Explorer и выберите в контекстном меню пункт Full-Text Index -> Define Full-Text Index (Полнотекстовый индекс -> Определить полнотекстовый индекс).
  2. Появится экран приглашения мастера Full-Text Indexing Wizard, приведенный на слайде. Щелкните на кнопке Next (Далее) для продолжения.
  3. Мастер предложит ввести одностолбцовый уникальный индекс из исходной таблицы. Этот индекс предоставляет iFTS возможность связать элементы полнотекстового индекса со строками исходной таблицы. Очень часто вы будете видеть целочисленный первичный ключ - обычно суррогатный ключ, используемый для построения индекса для iFTS.
  4. Затем мастер предложит выбрать столбец таблицы для индексации. Вы можете добавить любой столбец символьного, двоичного типа или типа большого объекта (LOB) к вашему полнотекстовому индексу.
  5. Следующий шаг мастера предоставляет выбор опций отслеживания изменений полнотекстового индекса. По умолчанию принимается автоматическое отслеживание изменений, что предполагает автоматическое обновления полнотекстового индекса при каждом изменении данных таблицы. Если таблица очень велика и ожидается много изменений ее данных, то автоматическое обновление может потребовать много системных ресурсов во время пиковых рабочих нагрузок. Если это так, вы можете предпочесть ручное обновление индекса либо автоматическое обновление по расписанию вместо автоматического при каждом изменении данных.
  6. Далее мастер позволит выбрать полнотекстовый каталог, в котором будет создан ваш полнотекстовый индекс. Вы можете выбрать существующий каталог или создать новый. Вы можете также выбрать группу файлов, на которой создать полнотекстовый индекс и полнотекстовый стоп-список для использования с полнотекстовым индексом. Стоп-списки состоят из стоп-слов - слов, считающихся неважными для полнотекстового поиска, вроде the, an, and и to. Стоп-слова при полнотекстовых запросах игнорируются. Мы детально обсудим стоп-списки далее.
  7. Дополнительно можно определить расписание наполнения для таблиц и полнотекстовых каталогов. Эта опция удобна, если вы решаете не использовать автоматическое отслеживание изменений для полнотекстового индекса, и хотите запланировать обновления на периоды минимальной нагрузки, или же просто иметь тонкий контроль над процессом наполнения полнотекстового индекса.
  8. На финальном шаге мастер Full-Text Indexing Wizard выводит итоговый экран, который позволяет просмотреть ранее выбранные опции. Это строго информационный экран, но он предоставляет возможность вернуться на предшествующие экраны, если вы допустили ошибку либо хотите внести изменения, прежде чем будет создан полнотекстовый индекс. Щелчок на кнопке Finish (Готово) на этом экране создаст полнотекстовый индекс в базе данных.

После щелчка на кнопке Finish в Full-Text Indexing Wizard отобразится экран хода работ, показывая успех или неудачу процесса создания полнотекстового индекса.
Для создания полнотекстового индекса с помощью T-SQL предусмотрен оператор CREATE FULLTEXT INDEX:

 

CREATE FULLTEXT INDEX ON Production.ProductModel (
 Name LANGUAGE 1033,
 CatalogDescription LANGUAGE 1033,
 Instructions LANGUAGE 1033 )
 KEY INDEX PK_ProductModel_ProductModelID ON (AWftsCatalog)
WITH (
 CHANGEJTRACKING AUTO,
 STOPLIST = SYSTEM
 );
 GO
 ALTER FULLTEXT INDEX ON Production.ProductModel
 ENABLE;
 GO

 Как и в примере с использованием мастера Full-Text Indexing Wizard, оператор CREATE FULLTEXT INDEX создает полнотекстовый индекс на ��толбцах Name, CatalogDescription и Instructions таблицы Production.ProductModel.
Каждый столбец в примере имеет необязательный идентификатор LANGUAGE, определяющий идентификатор локали (LCID) 1033, что означает американский английский. Также задано автоматическое отслеживание изменений и использования стоп-списка системы по умолчанию.
Чтобы узнать какие локали существуют обратитесь к представлению sys.fulltext_languages.

Предикат FREETEXT позволяет искать в символьном столбце или столбцах полнотекстового индекса слова, которые соответствуют флективной, расширенной с помощью тезауруса и заменяющей формам поисковой строки свободного текста. Предикат FREETEXT принимает имя столбца или список столбцов, поисковую строку свободного текста, необязательный LCID, и выполняет следующие шаги:

 

  • использует разбиение слов для разделения строки свободного текста на индивидуальные слова;
  • разветвляет слова, используя флективные формы;
  • идентифицирует расширения и замены слов на основе специфичного для языка тезауруса FTS.

Поскольку это предикат, FREETEXT может применяться в конструкции WHERE запроса SELECT. Все строки, для которых предикат FREETEXT возвращает true (соответствие), возвращаются при использовании FREETEXT.
Предикат FREETEXT находит как точное, так и приближенное соответствие слов, используя два метода:

  • осуществляя морфологический поиск (stemming) слова для нахождения флективных форм слова;
  • выполняя расширение и замену слов на основе языково-специфичных файлов тезауруса

Предикат FREETEXT автоматически выделяет основу слова (т.е. осуществляют морфологический поиск) для поиска флективных форм. Флективные формы слова включают существительные во множественном числе, глагольные спряжения и прочие варианты слова. В примере на слайде демонстрируется запрос FREETEXT, который выполняет автоматический морфологический поиск слова дом. Флективные формы дом включают существительные домов и дома.

Предикат CONTAINS допускает более развитые опции полнотекстового поиска, чем предикат FREETEXT. Подробно FREETEXT, предикат CONTAINS принимает в качестве параметров имя столбца или список столбцов, условие поиска и необязательный идентификатор языка. Мощь CONTAINS произрастает из его способности обрабатывать сложные условия поиска, в противоположность простым строкам, принимаемым FREETEXT. В дополнение к поиску простого слова или фразы, вы можете применять CONTAINS для поиска префикса слова или фразы, слова в приближении к другому слову, флективных производных или синонимов из тезауруса слов, либо комбинаций критериев поиска.
Простой предикат CONTAINS осуществляет базовый поиск ключевого слова, подобно FREETEXT. Но в отличие от FREETEXT, предикат CONTAINS не ищет автоматически флективных форм слова или синонимов из тезауруса.
Чтобы заставить CONTAINS использовать флективные формы синонимов тезауруса, укажите в условии поиска элемент генерации FORMSON.
Этот элемент имеет две опции:
INFLECTIONAL
Задает языковой парадигматический модуль, который будет использован для заданного простого выражения. Поведение парадигматического модуля определено правилами формирования основ для каждого конкретного языка. У нейтрального языка нет ассоциированного с ним парадигматического модуля. Язык столбцов, к которым выполняется запрос, используется для обращения к необходимому парадигматическому модулю.
THESAURUS
Указывает, что используется тезаурус, соответствующий языку полнотекстового столбца или языку, заданному в запросе. Самый длинный шаблон или шаблоны этого аргумента сравниваются с тезаурусом, и создаются дополнительные условия, которые можно использовать для расширения или замены начального шаблона.

Продолжение

во второй части.