Прежде всего, я думаю, что вам нужно предложение 'ON' при объединении с полнотекстовым текстом CONTAINSTABLE. Посмотрите этот пример на веб-сайте Microsoft:
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
Вам необходимо связать таблицу Product с правильными результатами поиска, добавив предложение объединения следующим образом:
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]
В противном случае вы не знаете, какие строки в таблице результатов объединяются с соответствующими строками в исходных таблицах.
Во-вторых, 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, которая пытается сгенерировать буквенно-цифровую клавишу на основе фонетического написания или аргумента.
-- 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 всегда возвращает начальную букву и первые три согласные звуки, представленные в числовом виде. Существуют более совершенные версии алгоритма, разработанные для замены soundex, см. Двойной метафон (или T-SQL версию Двойного метафона , которую можно использовать в качестве скаляра функция).
Soundex или DoubleMetaphone не встроены в полный текст SQL Server, поэтому вам нужно будет выполнить поиск вручную.
SELECT * FROM MyTable where SOUNDEX( MyColumn ) = SOUNDEX( 'MySearchQuery' )