|
Программирование >> Программирование баз данных
Применение приведенного выше кода должно привести к получению примерно десяти строк: ProductModellD Name 5 HL Mountain Frame 6 HL Road Frame 7 HL Touring Frame 8 LL Mountain Frame 9 LL Road Frame 10 LL Touring Frame 14 ML Mountain Frame 15 ML Mountain Frame-W 16 ML Road Frame 17 ML Road Frame-W (10 row(s) affected) Итак, мы успешно создали полнотекстовый индекс, и этот индекс действует! Теперь перейдем к рассмотрению того, какую информацию можно получить с помощью запросов к полнотекстовому индексу и какие еще возможности он предоставляет. Синтаксис полнотекстового запроса Для полнотекстового поиска также применяются запросы, но они имеют синтаксис, отличный от синтаксиса обычных запросов. В частности, в состав полнотекстовых запросов входят специальные команды, которые дополняют язык T-SQL и позволяют явно указать, что для поддержки запроса должна использоваться машина полнотекстового поиска, а не обычная машина обработки запросов SQL Server. К счастью, в своих основных формулировках полнотекстовые запросы являются не слишком сложными. Для работы с машиной полнотекстового поиска применяются всего лишь четыре основных оператора, которые подразделяются на две перекрывающиеся категории по два оператора в каждой (табл. 21.6). Таблица 21.6. Операторы (предикаты) полнотекстового поиска
По своему действию оба условных предиката чрезвычайно отличаются от операции EXISTS. По существу, эти предикаты применительно к каждой строке дают простой ответ (да или нет) на вопрос о том, соответствует ли данная строка предоставленным критериям поиска. И тот и другой условный предикат используется в конструкции WHERE запросов. С другой стороны, в двух предикатах ранжированных запросов применение условий вообще не предусматривается; но вместо строк они возвращают табличный результирующий набор (применимый в операциях соединения), содержащий значения ключей всех строк, для которых найдены соответствия (соединения формируются именно по этим знаниям ключей), а также оценки, составленные по определенной шкале и позволяющие определить степень согласования. Каждый из четырех предикатов, приведенных в табл. 21.6, подробно рассматривается в следующих разделах. Предикат contains Оператор запроса с предикатом CONTAINS позволяет найти искомую строку путем сопоставления с конкретным словом или словосочетанием. По умолчанию этот предикат предусматривает поиск точного согласования (при котором, если задано слово swim, то осуществляется поиск swim, а не swam), но могут также использоваться модификаторы, с помощью которьгх осуществляется поиск так называемых флективных согласований (слов, подвергшихся изменениям в результате применения к ним пра-BPUi склонения или спряжения, таких как swim и swam). В сочетании с предикатом CONTAINS могут применяться определенные ключевые слова. Но в примерах, которые будут рассматриваться в данной главе в первую очередь, предусмотрено использование простой формы предиката CONTAINS. Мы перейдем к рассмотрению расширенных функций только после ознакомления с основами применения указанных в табл. 21.6 четырех предикатов (некоторые модификаторы используются в сочетании с несколькими предикатами, поэтому их описание относится ко всем случаям их применения). Таким образом, основной синтаксис конструкции с предикатом CONTAINS выглядит следующим образом: CONTAINS({<column>I *} , <search condition>) В вызове этого предиката можно указать конкретный столбец с помощью параметра <column> или задать значение *; в последнем случае заданное условие поиска, <search condition>, будет применяться для определения согласования со всеми индексированными столбцами. Условие поиска в его простейшей форме должно содержать только одно слово или словосочетание. Следует отметить две особенности применения предиката CONTAINS. Во-первых, следует помнить, что обеспечивается получение только тех результатов, которые относятся к столбцам, включенным в полнотекстовый индекс. Применительно к индексу, окончательно созданному для таблицы ProductModel, это означает, что в поиск будут включены только столбцы Name и CatalogDescription, а такие столбцы, как Introduction, не участвуют в поиске, поскольку они не включены в индекс (напомним, что в одном из предыдущих примеров применения оператора ALTER мы удалили этот столбец). Во-вторых, условия поиска могут быть намного сложнее по сравнению с тем простым условием, которое здесь показано, но об этом речь пойдет позже, после того как будут описаны основные операции. В качестве примера еще раз рассмотрим запрос, который служил для проверки того, работает ли созданный нами полнотекстовый индекс после заполнения. SELECT ProductModellD, Name FROM Production.ProductModel WHERE CONTAINS(Name, Frame) В приведенном выше операторе уьсазано, что в таблице должны быть извлечены данные столбцов ProductModellD и Name из всех строк, в которых столбец Name, содержащийся в индексе, включает слово Frame. Сверка полученных результатов со столбцом Name показывает, что в каждой строке имеется точное соответствие. Рассмотрим еще один краткий пример. Предположим, что на этот раз должен быть выполнен примерно такой же запрос, но поиск необходимо провести по слову Sport: SELECT ProductModellD, Name FROM Production.ProductModel WHERE CONTAINS(Name, Sport )) В данном случае происходит возврат только одной строки: ProductModellD Name 33 Sport-100 (1 row(s) affected) И снова возвращены все строки таблицы, в которых в столбце Name было найдено точное согласование со словом Sport. Но просмотр других строк в таблице показывает, что в столбце Name имеются другие варианты слова Sport (в данном случае - в форме множественного числа), но они не были возвращены. Это также обусловлено применяемым вариантом вызова предиката CONTAINS, который по умолчанию обеспечивает поиск точного соответствия. Предикат freetext Предикат FREETEXT во многом напоминает предикат CONTAINS. Операторы вызова этих предикатов действительно имеют почти идентичный синтаксис, как показано ниже. FREETEXT({<column>I*} , <search condition>) Единственное реальное различие между этими предикатами заключается в том, что они возвращают разные результаты. Дело в том, что предикат FREETEXT предъявляет намного менее жесткие требования к точности согласования. В частности, при его использовании не требуется точное побуквенное согласование и могут учитываться формы слова. Чтобы ознакомиться с кратким примером применения этого предиката, рассмотрим запрос, предназначенный для поиска слова Sport, приведенный в последнем разделе, но внесем в него изменение в целях применения предиката FREETEXT, а не CONTAINS: SELECT ProductModellD, Name FROM Production.ProductModel ШЕКЕ FREETEXT (Name, Sport ) Выполнение этого оператора приводит к получению немного иных результатов по сравнению с предикатом CONTAINS: ProductModellD Name 13 Mens Sports Shorts 33 Sport-100 (2 row(s) affected) Различие состоит в том, что в рассматриваемом случае произведено согласование с формами искомого слова во множественном числе, поэтому запрос с предикатом FREETEXT возвратил не только строку со словом Sport, но и строку, содержащую слово Sports. Предикат FREETEXT обеспечивает также поиск таких вариантов слов, которые изменились в результате применения к ним правил склонения или спряжения, например, по указанному слову swim позволяет найти swam и другие варианты этого слова.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |