Запросы FREETEXT в SQL Server 2008 не соответствуют фразе - PullRequest
3 голосов
/ 16 декабря 2010

У меня есть полнотекстовая индексированная таблица в SQL Server 2008, которую я пытаюсь запросить для точного соответствия фраз с использованием FULLTEXT.Я не верю, что использование CONTAINS или LIKE подходит для этого, потому что в других случаях запрос может быть не точным (пользователь не заключает фразу в двойные кавычки), и в целом я хочу гибкость FREETEXT.

В соответствии с документацией [MSDN] для FREETEXT:

Если строка freetext_string заключена в двойные кавычки, вместо этого выполняется сопоставление фразы;stemming и тезаурус не выполняются.

, что заставило бы меня поверить в такой запрос:

SELECT Description  
FROM Projects   
WHERE FREETEXT(Description, '"City Hall"')  

будет возвращать результаты только в том случае, если термин "City Hall" появляется вПоле описания, но вместо этого я получаю следующие результаты:

1 Проект рампы для гандикапа в Manning Hall.
2 Исследование антенны.Клиент: Инженерный департамент города Крэнстон
3 Структурное расследование в отношении ущерба от пожара в Международном Зале Славы Тенниса.
4 Расследование крыши для предполагаемого проекта спутника в Вестнике Холла.
... и т. Д. 1021 *

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

SELECT Description  
FROM Projects  
WHERE Description LIKE '%City Hall%'  

1 Капитальный ремонт существующих и внутренних помещений существующегоздание муниципалитета Куинси, штат Массачусетс
2 Краткое структурное исследование башни мэрии Потакета, пораженной утечками.

Я уверен, что это тот случай, когда я не понимаю документацию, но есть ли способ достичь того, что я ищу?А именно, чтобы иметь возможность передать строку поиска без кавычек и получить именно то, что я получаю сейчас, или с кавычками и получить только эту точную фразу?

1 Ответ

4 голосов
/ 16 декабря 2010

Как вы сказали, FREETEXT ищет каждое слово в вашей фразе, а не фразу как все. Для этого вам нужно использовать оператор CONTAINS. Как это:

SELECT Description  
FROM Projects   
WHERE CONTAINS(Description, '"City Hall"')

Если вы хотите получить ранг результатов, вы должны использовать CONTAINSTABLE. Он работает примерно так же, но возвращает таблицу с двумя столбцами: [Key], который содержит первичный ключ таблицы поиска, и [Rank], который дает вам рейтинг результата.

...