Программирование >>  Программирование баз данных 

1 ... 251 252 253 [ 254 ] 255 256 257 ... 346


Предикат containstable

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

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

CONTAINSTABLE (<table>, {column*}, <contains search condition> [, <top n->] )

Таким образом, предикат CONTAINS возвращает простое булево значение, подходящее для использования в конструкции WHERE, а предикат CONTAINSTABLE возвращает таблицу с указанием оценки того, насколько полно искомое выражение соответствует возвращаемой строке.

Рассмотрим, что под этим подразумевается; для этого вызовем на выполнение исходный запрос, применив на этот раз предикат CONTAINSTABLE:

SELECT *

FROM CONTAINSTABLE(Production.ProductModel,Name, Sport)

Выполнение этого запроса приводит к получению только одной строки (как и при использовании предиката CONTAINS), но информация, предоставляемая возвращаемыми значениями, становится немного иной:

KEY RANK

33 128

(1 row(s) affected)

В результирующем наборе присутствуют следующие два столбца.

KEY. Напомним, что выше было указано требование к полнотекстовому индексу, согласно которому он должен ссылаться на ключ индексируемой таблицы, состоящий из единственного столбца. Значения KEY, возвращаемые предикатом CONTAINSTABLE, относятся именно к этому ключевому столбцу. Таким образом, значение, представленное в данном примере в столбце KEY, указывает на единственную уникальную строку в индексируемой таблице, обозначенную этим ключевым значением.

RANK. Значение от О до 1000, которое указывает, насколько полно искомый результат согласуется с возвращаемой строкой; чем выше это значение, тем лучше согласование.

Чтобы воспользоваться результатами, полученными с помощью предиката CONTAINSTABLE, достаточно создать соединение исходной таблицы с результатами CONTAINSTABLE. Такой пример приведен в следующем операторе:

SELECT Rank, ProductModellD, Name FROM Production.ProductModel p

JOIN CONTAINSTABLE(Production.ProductModel,Name, Sport) ct ON p.ProductModellD = ct.[KEY]



Обратите внимание на то, что имя столбца KEY заключено в квадратные скобки. Причина этого состоит в том, что имя столбца KEY одновременно является ключевым словом языка SQL. Напомним, что применяемые правила именования требуют заключать в квадратные скобки ключевые слова, используемые в качестве имен столбцов или таблиц (вообще говоря, такого применения к/ьючевых слов следует избегать).

В результате будет получена исходная строка, но на этот раз результирующий набор содержит дополнительную информацию, полученную из базовой таблицы: Rank ProductModellD Name

128 33 Sport-100

(1 row(s) affected)

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

Осуществлять поиск по какому-то произвольно заданному значению Rank. Это позволяет, например, определять наилучшие согласования, оценки которых превышают определенное пороговое значение.

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

Предикат freetexttable

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

Таким образом, мы можем применеть определенное сочетание некоторых из приведенных вьш1е примеров для ознакомления с тем, как действует предикат FREETEXTTABLE:

SELECT Rank, ProductModellD, Name FROM Production.ProductModel p

JOIN FREETEXTTABLE(Production.ProductModel,Name, Sport ) ct ON p.ProductModelID = ct.[KEY]

Выполнение этого оператора приводит к получению тех же двух строк, которые были получены в исходном запросе с предикатом FREETEXT, но, как и с помощью предиката CONTAINSTABLE, получены также оценки качества согласования: Rank ProductModellD Name

102 13 Mens Sports Shorts

102 33 Sport-100

(2 row(s) affected)

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



Поиск по словосочетаниям

Все предикаты полнотекстового поиска, перечисленные в табл. 21.6, позволяют выполнять поиск не только по словам, но и по словосочетаниям. Тем не менее синтаксический анализ и обработка словосочетаний происходят немного иначе.

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

SELECT ProductModellD, Name, CatalogDescription

FROM Production.ProductModel

WHERE CONTAINS(* , larger diameter )

Следует отметить, что словосочетание необходимо указывать в двойных кавычках; такое требование является обязательным во всех случаях, когда нужно обеспечить, чтобы ряд слов рассматривался как единый фрагмент текста. Но в данном случае поиск приводит к получению только одной строки. Общий полученный результат слишком велик (поскольку столбец CatalogDescription имеет большой размер), чтобы можно было включить его в текст книги, но ниже приведена соответствующая часть текста. The heat-treated welded aluminum frame has a larger diameter tube

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

Логические операции

в СУБД SQL Server предоставляется также возможность использовать логические операции при определении критериев поиска. Логические операции обозначаются следующими ключевыми словами.

AND.

OR.

AND NOT.

Фактически задача применения логических операций не представляет собой чего-то сложного, поэтому начнем с простого примера, за которым следует одно предостережение. Прежде всего рассмотрим один из вариантов примера, который использовался ранее:

SELECT ProductModellD, Name, CatalogDescription

FROM Production.ProductModel

WHERE CONTAINS(*, larger OR diameter )

Изменения no сравнению с предыдущим примером состоят в том, что вместо точного словосочетания larger diameter производится поиск любого из слов, входящих в это словосочетание, без учета того, встречаются ли эти слова одновременно или нет. Выполнение этого оператора показывает, что происходит возврат трех строк, а не одной.



1 ... 251 252 253 [ 254 ] 255 256 257 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика