2015-02-25 6 views
4

Я пытаюсь осуществить поиск-механизм с «СОДЕРЖИТ()» на SQL Server 2014.SQL содержит точную фразу

я прочитал здесь https://technet.microsoft.com/en-us/library/ms142538%28v=sql.105%29.aspx и в книге «Pro полнотекстового поиска в SQL Server 2008 ", что мне нужно использовать двойные кавычки для поиска точной фразы.

Но e.q. если я использую это CONTAINS(*, '"test"') Я получаю результаты, содержащие слова типа "численный". Если я попробую CONTAINS(*, '" test "'), то будет то же самое. Я заметил, что есть меньше результатов, как если бы я искал CONTAINS(*, '*test*') для префикса, sufix search, поэтому определенная разница между поисками.

Я не ожидал «численного» в первом утверждении. Есть ли объяснение этого поведения?

+0

Для начала, интервал по указанной вами ссылке отличается от вашего кода примера, вы пробовали: 'CONTAINS (*, '" test "')' – Tanner

+0

Разве это не означает, что Contains() делать? «Тест», несомненно, содержится в «численном». Я бы предположил, что точное означает, что он фиксируется для определенного термина, а не термин + перегибы термина, например FREETEXT(). – scheien

+0

'CONTAINS (*, '" test "')' результат тот же, что и первые два. Я бы использовал LIKE для точного поиска, но это длится долго. Единственное решение на данный момент - это два поиска с 'CONTAINS (*, '" test "')', а затем снова фильтровать результаты в коде ... Не очень красиво ... –

ответ

1

Contains(*,'"test"') будет соответствовать только полным словам «теста», как вы ожидаете.

Contains(*,'" test "') же, как и выше

Contains(*,'"*test*"') на самом деле будет делать Префикс ТОЛЬКО поиск, в основном удаляет любые специальные символы в начале слова и использует только 2-й *. Вы не можете выполнять поиск POSTFIX, используя полнотекстовый поиск.

Моя проблема заключается в том, что касается Содержит (*), это будет поиск любых полнотекстовых каталогизированных элементов во всей этой строке. Не видя данных, трудно сказать, но я предполагаю, что другой столбец в этой строке, который вы считаете плохим, на самом деле совпадает с «тестом».

1

Я искал свой мозг по очень похожей проблеме, и недавно нашел решение.

В моем случае я искал полные текстовые поля для «@username», но с использованием CONTAINS(body, "@username") вернул просто «имя пользователя». Я хотел, чтобы он строго соответствовал знаку @.

Я мог бы использовать LIKE "%@username%", но запрос занял минуту, что было неприемлемо, поэтому я продолжал искать.

С помощью некоторых людей в чате они предложили использовать как КОНТЕЙНКИ, так и LIKE. Итак:

SELECT TOP 25 * FROM table WHERE

CONTAINS(body, "@username") AND body LIKE "%@username%";

это работало отлично для меня, потому что содержит тянет как имя пользователя и @Username записи и затем LIKE отфильтровывает те, с символом @. Запросы занимают 2-3 секунды.

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

Смежные вопросы