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, включая следующие:
Архитектура 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:
Хост-процесс демона фильтрации (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 =
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, который проведит по всем этапам создания полнотекстового индекса. Для активизации мастера выполните следующие шаги.
После щелчка на кнопке Finish в Full-Text Indexing Wizard отобразится экран хода работ, показывая успех или неудачу процесса создания полнотекстового индекса. Для создания полнотекстового индекса с помощью T-SQL предусмотрен оператор CREATE FULLTEXT INDEX:
FULLTEXT
INDEX
Production.ProductModel (
Name
LANGUAGE 1033,
CatalogDescription LANGUAGE 1033,
Instructions LANGUAGE 1033 )
KEY
PK_ProductModel_ProductModelID
(AWftsCatalog)
(
CHANGEJTRACKING AUTO,
STOPLIST = SYSTEM
);
GO
ALTER
Production.ProductModel
ENABLE;
Как и в примере с использованием мастера Full-Text Indexing Wizard, оператор CREATE FULLTEXT INDEX создает полнотекстовый индекс на ��толбцах Name, CatalogDescription и Instructions таблицы Production.ProductModel. Каждый столбец в примере имеет необязательный идентификатор LANGUAGE, определяющий идентификатор локали (LCID) 1033, что означает американский английский. Также задано автоматическое отслеживание изменений и использования стоп-списка системы по умолчанию. Чтобы узнать какие локали существуют обратитесь к представлению sys.fulltext_languages. Предикат FREETEXT позволяет искать в символьном столбце или столбцах полнотекстового индекса слова, которые соответствуют флективной, расширенной с помощью тезауруса и заменяющей формам поисковой строки свободного текста. Предикат FREETEXT принимает имя столбца или список столбцов, поисковую строку свободного текста, необязательный LCID, и выполняет следующие шаги:
Поскольку это предикат, FREETEXT может применяться в конструкции WHERE запроса SELECT. Все строки, для которых предикат FREETEXT возвращает true (соответствие), возвращаются при использовании FREETEXT. Предикат FREETEXT находит как точное, так и приближенное соответствие слов, используя два метода:
Предикат FREETEXT автоматически выделяет основу слова (т.е. осуществляют морфологический поиск) для поиска флективных форм. Флективные формы слова включают существительные во множественном числе, глагольные спряжения и прочие варианты слова. В примере на слайде демонстрируется запрос FREETEXT, который выполняет автоматический морфологический поиск слова дом. Флективные формы дом включают существительные домов и дома. Предикат CONTAINS допускает более развитые опции полнотекстового поиска, чем предикат FREETEXT. Подробно FREETEXT, предикат CONTAINS принимает в качестве параметров имя столбца или список столбцов, условие поиска и необязательный идентификатор языка. Мощь CONTAINS произрастает из его способности обрабатывать сложные условия поиска, в противоположность простым строкам, принимаемым FREETEXT. В дополнение к поиску простого слова или фразы, вы можете применять CONTAINS для поиска префикса слова или фразы, слова в приближении к другому слову, флективных производных или синонимов из тезауруса слов, либо комбинаций критериев поиска. Простой предикат CONTAINS осуществляет базовый поиск ключевого слова, подобно FREETEXT. Но в отличие от FREETEXT, предикат CONTAINS не ищет автоматически флективных форм слова или синонимов из тезауруса. Чтобы заставить CONTAINS использовать флективные формы синонимов тезауруса, укажите в условии поиска элемент генерации FORMSON. Этот элемент имеет две опции: INFLECTIONAL Задает языковой парадигматический модуль, который будет использован для заданного простого выражения. Поведение парадигматического модуля определено правилами формирования основ для каждого конкретного языка. У нейтрального языка нет ассоциированного с ним парадигматического модуля. Язык столбцов, к которым выполняется запрос, используется для обращения к необходимому парадигматическому модулю. THESAURUS Указывает, что используется тезаурус, соответствующий языку полнотекстового столбца или языку, заданному в запросе. Самый длинный шаблон или шаблоны этого аргумента сравниваются с тезаурусом, и создаются дополнительные условия, которые можно использовать для расширения или замены начального шаблона. Продолжение
во второй части.