SQL Server 2008 - полнотекстовый запрос - PullRequest
1 голос
/ 03 мая 2010

У меня есть две таблицы в базе данных 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

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

Спасибо

1 Ответ

2 голосов
/ 03 мая 2010

Прежде всего, я думаю, что вам нужно предложение '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' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...