Запросы Freetext в SQL Server 2008 не сопоставление фразу
-
11-10-2019 - |
Вопрос
У меня есть полная таблица индексированной текста в SQL Server 2008, которую я пытаюсь запросить точное соответствие фразы с использованием полного текста. Я не верю, что использование содержит или подобно подходит для этого, потому что в других случаях запрос может быть не точным (пользователь не окружает фразу в двойных цитатах), и в целом я хочу гибкости Freetext.
Согласно документацияMsdn] для Freetext:
Если freetext_string заключается в двойных кавычках, вместо этого выполняется матч фразы; Stemming и тезаурус не выполняются.
что заставит меня поверить в такой запрос:
SELECT Description
FROM Projects
WHERE FREETEXT(Description, '"City Hall"')
Вернут только результаты, когда термин «мэрия» появляется в поле описания, но вместо этого я получаю такие результаты, как это:
1 Дизайн пандуса гандикапа в Manning Hall.
2 Расследование антенны. Клиент: City of Cranston Engineering Dept.
3 Структурное расследование в отношении повреждения пожара Международному теннисному Залу славы.
4 Расследование расследование крыши для предлагаемого спутникового дизайна в Herald Hall.
... так далее
Очевидно, что эти результаты включают хотя бы одно из слов в моей фразе, но не сама фразу. Что еще хуже, я думал, что результаты будут ранжированы, но два результата, которые я на самом деле хотел (потому что они включают в себя фактическую фразу), похоронены.
SELECT Description
FROM Projects
WHERE Description LIKE '%City Hall%'
1 Основной экстерьер и внутренний ремонт существующей мэрии для Куинси Массачусетс
2 Корментное структурное расследование башни Ратуши Паутакета, страдающая утечками.
Я уверен, что это случай, когда я не понимаю документацию, но есть ли способ достичь того, что я ищу? А именно, чтобы иметь возможность пройти в строку поиска без кавычек и получить именно то, что я получаю сейчас, или с кавычками и получить только эту точную фразу?
Решение
Как ты сказал, FREETEXT
Смотрите каждое слово в вашей фразе, а не фразу как все. Для этого вам нужно использовать CONTAINS
утверждение. Как это:
SELECT Description
FROM Projects
WHERE CONTAINS(Description, '"City Hall"')
Если вы хотите получить ранг результатов, вы должны использовать CONTAINSTABLE
. Анкет Он работает примерно одинаково, но возвращает таблицу с двумя столбцами: [Key] Wich содержит основной ключ таблицы поиска и [Rank], что дает вам ранг результата.