Главная » Microsoft SQL Server, Базы данных » Расширенные параметры поиска

0

Полнотекстовый поиск является мощным инструментом и предоставляет пользователю массу возможностей, которые можно реализовать с помощью функций contains и ContainsTable.

Поиск нескольких слов

В поисковую фразу может быть включено несколько слов; при этом используются связки OR и AND. Следующий запрос найдет все басни, одновременно содержащие в тексте слова “Tortoise” (черепаха) и “Hare” (заяц):

SELECT Title FROM Fable

WHERE CONTAINS (FableTextTortoise AND Hare’)

Будет получен следующий результат:

Title

The Hare and the Tortoise

Однако существует одно ограничение. Несмотря на то что механизм полнотекстового поиска позволяет искать одно слово в нескольких столбцах, того же нельзя сказать о поиске нескольких слов. Выполнить его возможно только по одному столбцу. Например, басня “The Ants and the Grasshopper” содержит слово “thrifty” (бережливый) в морали и слово “supperless” — в тексте самой басни. В данном случае следующий поиск не даст никаких результатов:

SELECT Title FROM Fable

WHERE CONTAINS (*,’ "Thrifty AND supperless" ‘)

Вместо результата мы получим сообщение:

(0 row(s) affected)

Существуют два решения этой проблемы, но ни одно из них нельзя назвать лучшим. Можно перестроить запрос таким образом, чтобы связка AND находилась в предложении WHERE, а не в параметре функции CONTAINS. Проблема этого решения заключается в низкой производительности. Следующий запрос выполняет два отдельных сканирования с помощью механизма полнотекстового поиска (рис. 13.2), каждое из которых занимает 363 миллисекунды; при этом общее время выполнения запроса составляет 811 миллисекунд:

SELECT Title FROM Fable

WHERE CONTAINS (*,’Thrifty’)

AND CONTAINS(*, ‘supperless’)

Будет получен следующий результат:

Title

The Ants and the Grasshopper

Рис. 13.2. Каждая функция contains требует отдельного удаленного вызова механизма полнотекстового поиска. Только после этого результаты просматриваются сервером

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

Поиск с использованием символов макроподстановки

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

Следует также запомнить, что символы макроподстановки работают только в конце слова, но не в начале. Индексы начинают поиск от начала строки, как в следующем примере:

SELECT Title FROM Fable

WHERE CONTAINS (*,’ "Hunt*" ‘)

Будет получен следующий результат:

Title

The Hunter and the Woodman The Ass in the Lion’s Skin The Bald Knight

Если во фразе используется символ макроподстановки “звездочка”, то он заменяет собой любое слово. Например, следующие два запроса эквивалентны:

CONTAINS (*,’Не pulled out the thorn*’)

CONTAINS (*,’He* pulled* out* the* thorn*’)

Поиск фраз

Полнотекстовый поиск будет пытаться искать полные фразы, если таковые заключены в функции contains в двойные кавычки. Например, для поиска басни про мальчика, который кричал на волка, мы можем использовать следующий трюк:

SELECT Title FROM Fable

WHERE CONTAINS (*,’ "Wolf! Wolf!" ‘)

Будет получен следующий результат:

Title

The Shepherd’s Boy and the Wolf

Поиск близких слов

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

Басня об Андрокле, который вынимал колючку из лапы льва, является самой длинной в рассматриваемой учебной базе данных. Ее мы и используем в качестве примера поиска в тексте близких слов “pardoned” и “forest”:

SELECT Title FROM Fable

WHERE CONTAINS (*,’pardoned NEAR forest’)

Будет получен следующий результат:

Title

Androcles

Существует и возможность поиска нескольких близких слов. В следующем примере мы будем искать близко расположенные слова “lion”, “paw” и “bleeding”:

SELECT Title FROM Fable

WHERE CONTAINS (*,’lion NEAR paw NEAR bleeding’)

Результат будет получен тот же:

Title

Androcles

Параметр близости можно использовать и в функции ContainsTable и получать ранг от 0 до 64, указывающий на степень близости слов. Следующий запрос ранжирует басни, содержащие слова “life” и “death”:

SELECT Fable.Title, Rank FROM Fable

JOIN CONTAINSTABLE (Fable, *,’life NEAR death’) FTS ON Fable.FablelD = FTS.[KEY]

ORDER BY FTS.Rank DESC

Будет получен следующий результат:

Title                                                                                            Rank

The Serpent and the Eagle                                            7

The Eagle and the Arrow                                                1

The Woodman and the Serpent                                   1

Поиск словоформ

Механизм полнотекстового поиска может осуществлять лингвистический анализ и искать однокоренные слова. Это позволяет искать слова, не волнуясь об их склонениях и спряжениях. Например, поиск слова “flying” может найти и слово “flew”. Для случаев, подобных данному, язык, используемый в таблице, имеет критическое значение. Также следует учесть, что данная функция не смешивает разные части речи, даже если они имеют один корень. Например, поиск существительного не найдет глагол с тем же корнем. Следующий запрос демонстрирует поиск слова “flew”, несмотря на то, что в параметрах функции contains задано слово “fly”:

SELECT Title FROM Fable

WHERE CONTAINS (*,’FORMSOF(INFLECTIONAL,fly)’)

Будет получен следующий результат:

Title

The Crow and the Pitcher The Bald Knight

Хорошие клиентские программы предоставляют пользователю возможность На заметку выделения в документе искомых слов. Если пользователь ввел слово “fly”, а найденное слово оказалось “flew”, то простой поиск и замена при форматировании пропустит его. Сценарий webhits.dll в сервере индексации поможет справиться с этой проблемой.

Поиск синонимов

Новым в версии SQL Server 2005 является поиск синонимов для замены слов. Чтобы сконфигурировать собственные параметры тезауруса, отредактируйте соответствующий файл в каталоге:

C:\Program Files\Microsoft SQL Server\MSSQL.l\MSSQL\Binn\FTERef

Файл тезауруса для вашего языка будет иметь вид TSXXX.xml, где XXX— код языка (например, ENU — для американского диалекта английского языка). Из своего файла тезауруса вам придется удалить линии комментариев. Если вы откроете этот файл в текстовом редакторе, то обнаружите в нем два раздела: expansion (узел расширения) и replacement (узел замены). Первый из них позволяет расширить аргумент поиска за счет других. Например, в английском файле тезауруса вы найдете следующие строки:

<expansion>

<sub>Internet Explorer</sub>

<sub>IE</sub>

<sub>IE5</sub>

</expansion>

Этот фрагмент позволяет преобразовать любой поиск аббревиатуры “IE” в поиск как “IE”, так и “Ш5” или “Internet Explorer”.

Узел замены используется для замены одного аргумента поиска другим. Например, слово “sex” может быть вполне заменено словом “gender”; для этого можно создать следующий раздел:

<replacement>

<pat>sex</pat>

< sub >gender</sub >

</replacement>

Элемент <pat> определяет шаблон, а элемент <sub> — подставляемое вместо него слово. Запросы FREETEXT автоматически используют соответствующие для данного языка тезаурусы. В следующем примере для использования в поиске тезауруса мы используем ключевое слово Thesaurus.

В результате будут возвращены строки, содержащие термины IE, IE5 и Internet Explorer.

Поиск с использованием веса слов

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

Параметр is about позволяет взвешивать слова в строках, подлежащих возвращению, поэтому его работа подобна булеву оператору OR.

В следующих двух запросах параметр weight используется для установки критичности слов “lion”, “brave” и “eagle”. В них будет проверяться только столбец текста басни fable text, чтобы результаты поиска не смешивались с данными столбцов заголовка и морали. В первом примере все слова имеют равный вес:

SELECT Fable.Title, FTS.Rank FROM Fable JOIN CONTAINSTABLE (Fable, FableText,

1ISABOUT (Lion weight (.5),

Brave weight (.5),

Eagle weight (.5))’,20) FTS ON Fable.FablelD = FTS.[KEY]

ORDER BY Rank DESC

Получим следующий результат:

Title                                                                                  Rank

Androcles                                                                    92

The Eagle and the Fox                                            85

The Hunter and the Woodman                              50

The Serpent and the Eagle                                              50

The Dogs and the Fox                                                       32

The Eagle and the Arrow                                                  21

The Ass in the Lion’s Skin                                               16

Если повысить важность слова “eagle”, то результат будет иным:

SELECT Fable.Title, FTS.Rank FROM Fable JOIN CONTAINSTABLE (Fable, FableText,

‘ISABOUT (Lion weight (.2),

Brave weight (.2),

Eagle weight (.8))’,20) FTS ON Fable.FablelD = FTS.[KEY]

ORDER BY Rank DESC

Будет получен следующий результат:

Title                                                                                            Rank

The Eagle and the Fox                                                    102

The Serpent and the Eagle                                              59

The Eagle and the Arrow                                                  25

Androcles                                                                              25

The Hunter and the Woodman                                        14

The Dogs and the Fox                                                          9

The Ass in the Lion’s Skin                                                  4

Когда в полнотекстовом поиске участвуют все столбцы, маленький размер морали и заголовка сделает относительно более важными слова, расположенные в тексте. Следующий запрос использует те же веса, что и предыдущий, однако в него включены все столбцы:

SELECT Fable.Title, FTS.Rank

FROM Fable

JOIN CONTAINSTABLE (Fable, *,

‘ISABOUT (Lion weight (.2),

Brave weight (.2),

Eagle weight (.8))’,20) FTS ON Fable.FablelD = FTS.[KEY]

ORDER BY Rank DESC

Будет получен следующий результат:

Title                                                                                            Rank

The Wolf and the Kid                                                              4 08

The Hunter and the Woodman                                             408

The Eagle and the Fox                                                           102

The Eagle and the Arrow                                                 8 0

The Serpent and the Eagle                                             8 0

Androcles                                                                              25

The Ass in the Lion’s Skin                                               23

The Dogs and the Fox                                                          9

Ранжирование относительно. Оно основано на частоте, близости и относительной важности слов. В басне “The wolf and the Kid” не содержится ни слова “lion”, ни “eagle”, упомянутых в запросе, однако в то же время в двух местах встречается слово “brave”. Данное слово реже встречается в тексте, но является одним из всего десяти слов, составляющих мораль. Даже несмотря на то, что слово “brave” имеет меньший вес, оно поставило басню во главу списка. Все основано на частоте слов и статистике (и, по-моему, на фазах луны).

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

По теме:

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