Проблема 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.