29 марта 2012 г.

Полнотекстовый поиск в MS SQL 2008: Часть 2. Написание полнотекстовых запросов

 

   В предыдущей статье мы создали и настроили механизм полнотекстового поиска в базе данных AdventureWorks. Теперь перейдем к написанию полнотекстовых поисковых запросов, на основе созданной нами инфраструктуры.

   Осуществлять полнотекстовые запросы можно двумя базовыми способами. С помощью предикатов CONTAINS и FREETEXT или функций CONTAINSTABLE и FREETEXTTABLE.

 

CONTAINS и CONTAINSTABLE

   Поиск при помощи предиката CONTAINS осуществляется следующим образом:

SELECT * FROM dbo.ProductSearchView WHERE CONTAINS(Description, 'bike');

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

   Вторым параметром идет непосредственно поисковый запрос. В примере выше – это поиск точного вхождения слова «bike». Однако, поисковый механизм очень гибкий и кроме поиска точного вхождения нам доступен ряд других типов поиска:

   1) Поиск по префиксному выражению. Такой запрос имеет следующий вид:

SELECT * FROM dbo.ProductSearchView WHERE CONTAINS(Description, '"bik*"');

   После слова запроса ставится звездочка, и все выражение обязательно берется в двойные кавычки. В результате данного запроса будут выведены все результаты, в которых есть слово, которое начинается с выражения «bik».

   2) Поиск синтаксических форм слов. Это один из самых мощных режимов поиска. Для работы в этом режиме используется ключевое слово FORMSOF и два параметра поиска: INFLECTIONAL и THESAURUS.

SELECT * FROM dbo.ProductSearchView WHERE CONTAINS(Description, 'FORMSOF(INFLECTIONAL, bike)');

   В данном запросе будут выбраны все строки, которые содержат слово «bike» или какую-либо форму этого слова, например «biking». Параметр INFLECTIONAL задает поиск по синтаксическим формам слова.

   Если вместо INFLECTIONAL подставить параметр THESAURUS, то будут выбраны строки, которые содержат данное слово, либо его синоним из словаря для конкретного языка.

   3) Поиск выражения с учетом расположения. При поиске разработчик может ограничить расстояние, на котором могут находиться в тексте искомые слова запроса. Это делается с помощью ключевого слова NEAR либо оператора ~.

SELECT * FROM dbo.ProductSearchView WHERE CONTAINS(Description, 'bike NEAR quick')

   В данном запросе будут выбраны строки, в которых слово «bike» находится в тексте недалеко, по отношению к слову «quick». Запрос может содержать любую цепочку слов, соединенных оператором NEAR.

   4) Поиск с учетом веса слов. В данном режиме каждому слову в поисковом запросе можно присвоить коэффициент веса (от 0 до 1). Механизм полнотекстового поиска будет строить результирующую выборку данных на основе вхождения слов с наибольшими коэффициентами значимости.

   Запрос будет выглядеть следующим образом:

SELECT * FROM dbo.ProductSearchView WHERE CONTAINS(Description, 'ISABOUT(bike weight(0.8), quick weight(0.5))');

   После ключевого слова ISABOUT в скобках через запятую указывается список слов запроса. После каждого слова идет ключевое слово weight и коэффициент веса.

   5) Комбинированный режим поиска. В этом режиме разработчик может комбинировать при помощи логических операторов AND, AND NOT, или OR различные механизмы поиска, перечисленные выше. Такой режим позволяет максимально гибко создавать высокоэффективные поисковые механизмы, ориентируясь на задачи конкретной системы или приложения.

   Этими пять режимов составляют ядро полнотекстового поиска с использованием предиката CONTAINS.

   Функция CONTAINSTABLE работает в тех же режимах, что и предикат CONTAINS. Различие заключается в форме ее вызова и более расширенном представлении результатов. Запрос, с использованием данной функции выглядит следующим образом:

SELECT * FROM CONTAINSTABLE(dbo.ProductSearchView,

Description, 'ISABOUT(bike weight(0.8), quick weight(0.5))', 10) as result

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

   Второй параметр – перечень столбцов представления или таблицы, в которых необходимо проводить поиск текста.

   Третий параметр – поисковый запрос (формируется таким же образом, как и в предикате CONTAINS).

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

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

KEY

RANK

1201

87

690

75

554

60

209

55

249

55

746

37

64

29

88

29

168

29

320

29

   Столбец KEY – это первичный ключ записи в представлении ProductSearchView, а RANK – это коэффициент релевантности данных. Для каждого результата механизм SQL Server устанавливает коэффициент, который определяет, насколько данный результат соответствует поисковому запросу. Отсортировав результаты по полю RANK, разработчик сможет вернуть в приложение наиболее точные результаты поиска. При задании в функции CONTAINSTABLE четвертого параметра, результаты сортируются по полю RANK автоматически.

 

FREETEXT и FREETEXTABLE

   Данный тип поиска является наиболее интеллектуальным во всем механизме полнотекстового поиска SQL Server. Поиск при помощи CONTAINS основан на дословном поиске результатов. Предикат FREETEXT не просто ищет конкретные слова и формы в тексте, а проводит интеллектуальный анализ поискового запроса и ищет подходящие строки по смыслу запроса.

   Приведем пример такого запроса:

SELECT * FROM dbo.ProductSearchView WHERE FREETEXT(Description, 'provides a light stiff ride')

   Данный запрос вернет 34 результата. В случае, если переписать данный запрос с предикатом CONTAINS, то получим лишь один результат.

   Функция FREETEXTTABLE (аналогично CONTAINSTABLE), отличается от предиката FREETEXT формой вызова и наличие ранга релевантности результатов:

SELECT * FROM FREETEXTTABLE(dbo.ProductSearchView, Description, 'provides a light stiff ride', 40) as result

 

   Выводы

   В данной статье мы рассмотрели примеры написания базовых запросов для механизма полнотекстового поиска в MS SQL 2008. Были приведены примеры использования основных предикатов. Использование предикатов в поисковых запросах – очень гибкий механизм, и вы сможете легко организовывать эффективный поиск в своих программах, научившись правильно подбирать и группировать предикаты в своих поисковых запросах.

Комментариев нет:

Отправить комментарий