Проблема SQL: Использование CONTAINS () не работает, но LIKE работает нормально - PullRequest
14 голосов
/ 26 февраля 2009

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

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. Я новичок в полнотекстовых индексах, поэтому любая помощь приветствуется.

Ответы [ 5 ]

13 голосов
/ 26 февраля 2009

Две мысли:

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

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

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

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

4 голосов
/ 26 февраля 2009

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

1 голос
/ 28 января 2014

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

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

Я побежал

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

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

0 голосов
/ 26 февраля 2009

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

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

0 голосов
/ 26 февраля 2009

Можете ли вы попробовать

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...