Розширені параметри пошуку

Повнотекстовий пошук є потужним інструментом і надає користувачеві масу можливостей, які можна реалізувати за допомогою функцій 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 (*, &quotThrifty AND supperless&quot )

Замість результату ми отримаємо повідомлення:

(0 row(s) affected)

Існують два рішення цієї проблеми, але жодне з них не можна назвати кращим Можна перебудувати запит таким чином, щоб звязка AND перебувала в реченні WHERE, а не в параметрі функції CONTAINS Проблема цього рішення полягає в низькій продуктивності Наступний запит виконує два окремих сканування за допомогою механізму повнотекстового пошуку (рис 132), кожне з яких займає 363 мілісекунди при цьому загальний час виконання запиту становить 811 мілісекунд:

SELECT Title FROM Fable

WHERE CONTAINS (*,Thrifty)

AND CONTAINS(*, supperless)

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

Title

The Ants and the Grasshopper

Рис 132 Кожна функція contains вимагає окремого віддаленого виклику механізму повнотекстового пошуку Тільки після цього результати проглядаються сервером

Ще одне рішення пошуку в кількох стовпцях полягає у створенні додаткового стовпця для зберігання всього потенційно шуканого тексту і дублювання даних з вихідних стовпців за допомогою тригера Це рішення теж не найкраще, оскільки дані дублюються, а продуктивність знижується за рахунок запуску тригера Ключ до вирішення завдання полягає у використанні OLAP замість OLTP

Пошук з використанням символів макропідстановки

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

Слід також запамятати, що символи макропідстановки працюють тільки в кінці слова, але не на початку Індекси починають пошук від початку рядка, як у наступному прикладі:

SELECT Title FROM Fable

WHERE CONTAINS (*, &quotHunt*&quot )

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

Title

The Hunter and the Woodman The Ass in the Lions Skin The Bald Knight

Якщо у фразі використовується символ макропідстановки зірочка, то він замінює собою будь-яке слово Наприклад, наступні два запити еквівалентні:

CONTAINS (*, Чи не pulled out the thorn *)

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

Пошук фраз

Повнотекстовий пошук буде намагатися шукати повні фрази, якщо такі укладені у функції contains в подвійні лапки Наприклад, для пошуку байки про хлопчика, який кричав на вовка, ми можемо використовувати наступний трюк:

SELECT Title FROM Fable

WHERE CONTAINS (*, &quotWolf Wolf&quot )

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

Title

The Shepherds 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 FableTitle, Rank FROM Fable

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

ORDER BY FTSRank 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, то простий пошук і заміна при форматуванні пропустить його Сценарій webhitsdll в сервері індексації допоможе впоратися з цією проблемою

Пошук синонімів

Новим у версії SQL Server 2005 є пошук синонімів для заміни слів Щоб конфігурувати власні параметри тезауруса, треба редагувати відповідний файл в каталозі:

C:\Program Files\Microsoft SQL Server\MSSQLl\MSSQL\Binn\FTERef

Файл тезауруса для вашої мови буде мати вигляд TSXXXxml, де XXX-код мови (наприклад, ENU – для американського діалекту англійської мови) Зі свого файлу тезауруса вам доведеться видалити лінії коментарів Якщо ви відкриєте цей файл у текстовому редакторі, то виявите в ньому два розділи: expansion (вузол розширення) і replacement (вузол заміни) Перший з них дозволяє розширити аргумент пошуку за рахунок інших Наприклад, в англійській файлі тезауруса ви знайдете наступні рядки:

&ltexpansion&gt

&ltsub&gtInternet Explorer&lt/sub&gt

&ltsub&gtIE&lt/sub&gt

&ltsub&gtIE5&lt/sub&gt

&lt/expansion&gt

Цей фрагмент дозволяє перетворити будь-який пошук абревіатури IE в пошук як IE, так і Ш5 або Internet Explorer.

Вузол заміни використовується для заміни одного аргументу пошуку іншим Наприклад, слово sex може бути цілком замінено словом gender; для цього можна створити наступний розділ:

&ltreplacement&gt

&ltpat&gtsex&lt/pat&gt

&lt sub &gtgender&lt/sub &gt

&lt/replacement&gt

Елемент визначає шаблон, а елемент – Підставляйте замість нього слово Запити FREETEXT автоматично використовують відповідні для даної мови тезауруси У наступному прикладі для використання в пошуку тезауруса ми використовуємо ключове слово Thesaurus

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

Пошук з використанням ваги слів

При пошуку безлічі слів може братися до уваги їх відносна вага (тобто одне може бути більш критично, інше – менш) Ваги встановлюються в діапазоні від нуля до одиниці

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

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

SELECT FableTitle, FTSRank FROM Fable JOIN CONTAINSTABLE (Fable, FableText,

1ISABOUT (Lion weight (5),

Brave weight (5),

Eagle weight (5)),20) FTS ON FableFablelD = 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 Lions Skin                                               16

Якщо підвищити важливість слова eagle, то результат буде іншим:

SELECT FableTitle, FTSRank FROM Fable JOIN CONTAINSTABLE (Fable, FableText,

‘ISABOUT (Lion weight (2),

Brave weight (2),

Eagle weight (8)),20) FTS ON FableFablelD = 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 Lions Skin                                                  4

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

SELECT FableTitle, FTSRank

FROM Fable

JOIN CONTAINSTABLE (Fable, *,

‘ISABOUT (Lion weight (2),

Brave weight (2),

Eagle weight (8)),20) FTS ON FableFablelD = 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 Lions Skin                                               23

The Dogs and the Fox                                                          9

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

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*