Можно ли объединить инфлекционный и бесконтактный поиск в одном условии CONTAINSTABLE? - PullRequest
3 голосов
/ 06 января 2011

Я играю в базе данных AdventureWorks с полнотекстовым поиском.В production.ProductDescription я пытаюсь найти слова «гора» и «замены».

Я знаю, что есть запись со следующим описанием:

High-performance mountain replacement wheel.

Мой первый обход был:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'mountain NEAR replacements' 
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

Возвращено 0 строк.Если я заменю «замена ГОРЯЧЕГО РЯДА» на «замена ГОРЯЧЕГО РЯДА», я получаю ожидаемую запись в результирующем наборе данных.

Моя следующая попытка состояла в том, чтобы попробовать что-то вроде следующего:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

, но это приводит к ошибке

Syntax error near 'NEAR' in the full-text search condition 'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"'.

Я посмотрел на грамматику для CONTAINSTABLE иоказывается, что в одном и том же условии поиска вы не можете использовать generation_term (например, FORMSOF ()) и термин близости (например, NEAR).

Я добавил в таблицу следующую запись:

Replacement parts for you omg gee-whiz mountain

Эта запись занимает высокое место (96) в следующем запросе fts:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL,"replacements") AND "mountain"' 
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]     
ORDER BY ct.RANK DESC;

, но, как и ожидалось, ниже (32) в этом запросе:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    '"replacement" NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

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

1 Ответ

2 голосов
/ 25 июня 2012

Последняя запись, которую вы добавили "Запасные части для вас, боже мой!"

Слово «замена» не совсем рядом со словом «гора», поэтому рейтинг довольно низкий.

В примере Adventureworks вы смотрите описания продуктов, которые на самом деле довольно короткие, а не совсем то, для чего предназначался оператор NEAR.

В этом случае я бы просто использовал

'FORMSOF(INFLECTIONAL, "replacement") AND FORMSOF(INFLECTIONAL, "mountain")' 

или изменение этого с вашим примером CONTAINSTABLE.

SELECT  
  pd.Description,  
  ct.RANK 
FROM Production.ProductDescription AS pd  
  INNER JOIN CONTAINSTABLE( 
    Production.ProductDescription,  
    Description,  
    'FORMSOF(INFLECTIONAL,"replacements") AND FORMSOF(INFLECTIONAL,"mountain")'  
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]      
ORDER BY ct.RANK DESC; 

Интересно, что ваш запрос, о котором вы сказали, дает вам 96 баллов, а только 32 балла. Я использую SQL Server 2005 для тестирования и настраиваю полнотекстовый индекс для Product.ProductDescription.Description с использованием значений по умолчанию.

Трудно сказать, что именно способствует более высокому ранжированию здесь, учитывая, что эти очень похожие записи имеют совершенно разные рейтинги: Запасное горное колесо для райдера начального уровня. - 96 Замена горного колеса от случайного до серьезного гонщика. - 48

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...