Проблема SQL: использование CONTAINS() не работает, но LIKE отлично работает
У меня есть таблица Products в базе данных SQL Server, и мне нужно устранить устаревшую хранимую процедуру, которая использует полнотекстовую индексацию. Для наших целей давайте предположим, что таблица Products имеет два идентификатора полей, ключевые слова. Поле "Ключевые слова" заполняется следующим образом:
ROLAND SA-300 Этот Roland SA-300 является в состоянии MINT!
Когда я запускаю следующий оператор, я могу получить запись:
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". Я новичок в полнотекстовых индексах, поэтому любая помощь приветствуется.
Ответы
Ответ 1
Две мысли:
(1) Дефис можно рассматривать как разрыв слов
Что они возвращают?
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300')
Смотрите этот другой вопрос.
(2) Вы пробовали перестроить свой полнотекстовый индекс? Возможно, он устарел.
Ответ 2
Оказывается, мне нужно было перестроить мой полнотекстовый индекс. Спасибо за советы @MichaelGG и @JohnFx
Ответ 3
Ах! Спасибо, @GregD. У нас был поиск, который не нашел строку "это никогда не заканчивается" при поиске "this *" или "never *". Оказывается оба слова находятся в файле noiseENG.txt.
Не похоже, что это можно отключить для каждого запроса, но на основании этого:
SQL 2008: Отключить стоп-слова для запроса полного текстового поиска
Я побежал
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
и мы начали получать желаемые результаты.
Ответ 4
Посмотрели ли вы на файл шумовых слов? На моей машине он находится здесь c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseENG.txt
Один из способов, которым вы могли бы проверить это, - это отредактировать свой файл шума только одним пространством, чтобы он индексировал все и снова попробовал ваш запрос. Я бы "проверил" это в тестовой среде, а не на производстве.
Ответ 5
Можете ли вы попробовать
SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')
Я видел пример того, что вы пытаетесь сделать на msdn.