Запросы FREETEXT в SQL Server 2008 не соответствуют фразе

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

Согласно документации [MSDN] для FREETEXT:

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

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

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

будет возвращать результаты только в том случае, если в поле «Описание» появляется термин «Мэрия», но вместо этого я получаю такие результаты:

1 Проект пандуса для инвалидов в Manning Hall.
2 Исследование антенны. Заказчик: Инженерный отдел города Крэнстон.
3 Исследование конструкции в связи с ущербом, нанесенным пожаром Международному залу теннисной славы.
4 Исследование Исследование крыши для предлагаемого проекта спутника в Herald Hall.
... и т. д.

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

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

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

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


person MKing    schedule 16.12.2010    source источник
comment
Я знаю, что это старо, но я столкнулся с той же проблемой и только что нашел этот отчет об ошибке: FREETEXT в SQL Server 2008 R2 больше не работает, как указано в документации, для поиска фраз   -  person bfavaretto    schedule 11.02.2012


Ответы (1)


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

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

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

person Lamak    schedule 16.12.2010
comment
Итак, вы говорите, что, когда в документации говорится, что вместо этого выполняется совпадение фразы, это не означает (из-за отсутствия лучших терминов) совпадение точной фразы? Думаю, я просто считаю, что это вводит в заблуждение. По сути, нет способа получить именно то, что я хочу, мне нужно будет проанализировать поисковый запрос и отправить части в кавычках как запросы СОДЕРЖИТ и не в кавычках, используя FREETEXT? - person MKing; 16.12.2010
comment
Вы можете использовать CONTAINS с текстом в кавычках или без него, без них он ведет себя аналогично FREETEXT. Разница в том, что с помощью FREETEXT он находит производные слова, а не только точные слова. - person Lamak; 16.12.2010