2015-05-12 4 views
2

У меня есть полнотекстовый индексный столбец nvarchar (max) при установке SQL Server 2012. Если в одной строке столбца есть данные о бла-бла-бла-бла-бла-бла-бла-бла-бла. Когда я бегу следующие вопросы, те, которые возвращают строку показаны:SQL Server Полнотекстовый поиск для числовой строки с запятыми

SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1,234,567*"') --true 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1234567*"') --true 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1,234*"') --true 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1234*"') --true 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1,234,5*"') --false 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"12345*"') --true 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"1,234,56*"') --false 
SELECT ftext FROM dbo.Test WHERE Contains([ftext], '"123456*"') --true 

Сначала я только предположил, что запятая лечилась как шум, но это, кажется, не так, как «1234567 *» и «1,234 *» возвращают результат, а «1,234,5 *» и «1,234,56 *» - нет. Почему это?

+0

Вы используете список стоп-слов? (По умолчанию используется список стоп-слов системы.) Если да, попробуйте отключить его, переиндексировать и посмотреть, не исчезла ли эта проблема. Я подозреваю, что список стоп-слов вызывает какое-то странное поведение. – Keith

+0

Я запускал «ALTER FULLTEXT INDEX ON dbo.Test SET STOPLIST = OFF», а затем повторно заполнял полный текстовый индекс и до сих пор получаю тот же результат. – cl0rkster

ответ

1

Это поведение связано с комбинацией того, как обрабатываются числовые значения и как применяется прерыватель слова к поисковому запросу. Короче говоря, если текст выглядит как номер без подстановочного знака, тогда он обрабатывается как число, в противном случае его обрабатывают как строку.

При поиске с допустимым числом с запятыми полный текстовый движок будет рассматривать его как строку, так и число. Вы можете увидеть это в действии, используя sys.dm_fts_parser, который используется движком для синтаксического анализа строки поиска. Например, вот результаты SELECT display_term FROM sys.dm_fts_parser (' "1,234,567*" ', 1033, 0, 0):

display_term 
--------------------- 
1,234,567  <-- string 
nn1234567  <-- number 

Я немного не уверен в том, как 1,234,567 хранится в полнотекстовом индексе - это будет один из указанных выше значений, указанных выше, или оба - но независимо, легко увидеть, как "1,234,567*" найдет совпадение в индексе.

Теперь давайте попробуем "1,234,56*". Результаты SELECT * FROM sys.dm_fts_parser (' "1,234,56*" ', 1033, 0, 0) являются:

display_term 
--------------------- 
1 
nn1 
234 
nn234 
56 
nn56 

Вау, что случилось? Ну, 1,234,56 не является допустимым числом, поэтому он рассматривается как строка. Таким образом, он разделяется запятыми, а отдельные значения (1, 234, 56) обозначаются как строки или цифры. Это то же самое, что если бы вы искали "1" AND "234" AND "56*".

Некоторые идеи для работы вокруг этого поведения:

  • Используйте LIKE запрос вместо SELECT ftext FROM dbo.Test WHERE [ftext] LIKE '1,234,56%'
  • Предварительно процесс поиска строки для удаления запятых из цифр.
Смежные вопросы