2010-05-03 2 views
1

У меня есть две таблицы в базе данных SQL Server 2008 в моей компании. Первая таблица представляет продукты, которые продает моя компания. Вторая таблица содержит данные производителя продукта. Эти таблицы определяются следующим образом:SQL Server 2008 - полный текст запроса

Product 
    ------- 
    ID 
    Name 
    ManufacturerID 
    Description 

    Manufacturer 
    ------------ 
    ID 
    Name 

Как вы можете себе представить, я хочу, чтобы сделать это как можно проще для наших клиентов, чтобы запросить эти данные. Однако у меня возникают проблемы с написанием прощающего, но мощного поискового запроса. Например, я ожидаю, что люди будут искать на основе фонетического написания. Из-за этого данные могут не совпадать с точными данными в моей базе данных. Кроме того, я думаю, что некоторые люди сначала будут искать имя производителя, но я хочу, чтобы имена соответствующих продуктов отображались первыми. Исходя из этих требований, я в настоящее время работаю над следующим запросом:

select 
    p.Name as 'ProductName', 
    m.Name as 'Manufacturer', 
    r.Rank as 'Rank' 
    from 
    Product p inner join Manufacturer m on p.ManufacturerID=m.ID 
     inner join CONTAINSTABLE(Product, Name, @searchQuery) as r 

Как ни странно, этот запрос бросает ошибку. Однако я понятия не имею, почему. Справа от последней круглой скобки в студии управления. Наконечник инструмента говорит «Выражение небулевого типа, указанное в контексте, где ожидается условие». Я понимаю, что это означает. Однако, я думаю, я не знаю, как работает COntainsTable. Что я делаю не так?

Спасибо

+0

У вас есть условие INNER JOIN, в которое вы не вставляете? (например, AS r ON p.ID = r. [KEY]) –

ответ

2

Во-первых, я думаю, что вам нужно положение «включено» при вступлении в полнотекстовом CONTAINSTABLE. Смотрите этот пример с сайта Microsofts:

USE Northwind; 
GO 
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK 
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
     '("sweet and savory" NEAR sauces) OR 
     ("sweet and savory" NEAR candies)' 
     ) AS KEY_TBL 
     ON FT_TBL.CategoryID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
    AND FT_TBL.CategoryName <> 'Seafood' 
ORDER BY KEY_TBL.RANK DESC; 
GO 

http://msdn.microsoft.com/en-us/library/ms177652.aspx

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

SELECT 
    p.Name AS 'ProductName', 
    m.Name AS 'Manufacturer', 
    r.Rank AS 'Rank' 
    FROM 
    Product p 
     INNER JOIN Manufacturer m ON p.ManufacturerID=m.ID 
     INNER JOIN CONTAINSTABLE(Product, Name, @searchQuery) AS r 
     ON p.ID = r.[KEY] 

В противном случае вы не» t известно, какие строки в таблице результатов присоединяются к соответствующим строкам в исходных таблицах.

Во-вторых, CONTAINS и CONTAINSTABLE оба возвращают точную строку, если вы не используете подстановочные знаки (например, '"bol*"'). Даже при использовании подстановочных знаков вы можете использовать только суффиксы, поэтому для '"bol*"' найдут все слова, начинающиеся с 'bol'. '"*bol*"' не найдет слов с 'bol' в них. Для неточного поиска нечеткого стиля вы должны использовать FREETEXT(...) или FREETEXTTABLE(...).

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

http://msdn.microsoft.com/en-us/library/ms177652.aspx

Компромисс в том, что CONTAINS выполняет намного лучше, чем FREETEXT и FREETEXT обеспечивает более естественные результаты.

Наконец, если вы хотите, чтобы фонетически совпадать, SQL Server имеет встроенную функцию SOUNDEX, которая пытается сгенерировать alphanumerickey на основе фонетической орфографии или аргумента.

-- Using SOUNDEX 
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe'); 

    Copy 
----- ----- 
S530 S530 

(1 row(s) affected) 

http://msdn.microsoft.com/en-us/library/ms187384.aspx

Я бы посоветовал против использования Soundex, хотя, я нашел, что это ограничение в прошлом, потому что Саундэкс действительно только гарантирует, что слова начать фонетически. Soundex всегда возвращает стартовую букву и первые три звуковых сигнала согласных, представленных численно. Существуют лучшие версии алгоритма, которые были разработаны как замена для soundex, см. Double Metaphone (или T-SQL version of Double Metaphone, которые можно использовать в качестве скалярной функции).

Soundex или DoubleMetaphone не встроены в полный текст SQL Server, поэтому вам потребуется выполнить поиск вручную.

SELECT * FROM MyTable where SOUNDEX(MyColumn) = SOUNDEX('MySearchQuery') 
+0

Большое спасибо за этот ответ. Это такой подробный ответ, и он определенно указывает на меня в правильном направлении. – user208662

Смежные вопросы