Проблема 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)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
Один из способов проверить это - отредактировать свой конкретный файл шума с одним пробелом, чтобы он все проиндексировал, и повторить запрос. Я бы «протестировал» это в тестовой среде, а не в продакшене.
Ты можешь попробовать
SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')
Я видел пример того, что вы пытаетесь сделать на msdn .
Ах! Спасибо @GregD. У нас был поиск, который не находил строку «это никогда не заканчивается» при поиске «это *» или «никогда *». Оказывается, оба слова находятся в noiseENG.txt.
Не похоже, чтобы это можно было отключить для каждого запроса, но исходя из этого: SQL 2008: отключить стоп-слова для запроса полнотекстового поиска
Я побежал
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
и мы начали получать желаемые результаты.