Проблема SQL: использование CONTAINS () не работает, но LIKE работает нормально

У меня есть таблица продуктов в базе данных SQL Server, и мне нужно устранять неполадки устаревшей хранимой процедуры, которая использует полнотекстовое индексирование. Для наших целей предположим, что таблица «Товары» имеет два идентификатора поля: «Ключевые слова». И поле Ключевые слова заполняется следующим:

ROLAND SA-300 Этот Roland SA-300 находится в отличном состоянии!

Когда я запускаю следующий оператор, я могу получить запись:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%'

Однако, когда я запускаю любой из следующих операторов, я получаю нулевой результат:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"')

Но я знаю, что функция CONTAINS () работает, потому что я получаю результаты, когда выполняю любое из этих действий:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')

Мне нужно выяснить, почему функция CONTAINS () не работает с термином «SA-300». Я новичок в полнотекстовых индексах, поэтому приветствую любую помощь.

Ответов (5)

Решение

Две мысли:

(1) Дефис можно рассматривать как разрыв слова. Что они возвращают?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300')

См. Этот другой вопрос .

(2) Вы пытались перестроить свой полнотекстовый индекс? Возможно, он устарел.

Вы смотрели свой файл шумовых слов? На моей машине он находится здесь c: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

Один из способов проверить это - отредактировать свой конкретный файл шума с одним пробелом, чтобы он все проиндексировал, и повторить запрос. Я бы «протестировал» это в тестовой среде, а не в продакшене.

Оказалось, что мне нужно было перестроить свой полнотекстовый индекс. Спасибо за советы @MichaelGG и @JohnFx

Ты можешь попробовать

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')

Я видел пример того, что вы пытаетесь сделать на msdn .

Ах! Спасибо @GregD. У нас был поиск, который не находил строку «это никогда не заканчивается» при поиске «это *» или «никогда *». Оказывается, оба слова находятся в noiseENG.txt.

Не похоже, чтобы это можно было отключить для каждого запроса, но исходя из этого: SQL 2008: отключить стоп-слова для запроса полнотекстового поиска

Я побежал

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

и мы начали получать желаемые результаты.