Проблема связана с комбинацией 1) с использованием нейтрального языка 2) плюс стоп-лист для вашего полного текстового индекса 3) плюс непредвиденное поведение при использовании подстановочного знака при поиске, включающем в себя стоп-слова.
Нейтральный язык не охватывает все нюансы английского языка, поэтому в индексном времени он считает, что O'neill
является 2 отдельными словами O
и neill
. Тогда ваш стоп-лист считает, что O
является секундомером, поэтому это «слово» не добавляется к индексу, только neill
есть.
В поисковом режиме поисковая система обычно игнорирует слова остановки в многословных фразах. Например, поиск Contains(*, '"we x people"')
будет соответствовать текстам ...we the people...
, x
и the
оба являются секундомерами и, таким образом, автоматически «сопоставляются» друг с другом. (Я использую термин «соответствующий» свободно, потому что поисковая система не сопоставляя стоп-слова, а он знает, что people
1 слово от we
.)
Таким образом, вы могли бы ожидать поиска подстановочных Contains(*, '"we the people*"')
также найти свой матч , , за исключением того, что это не при использовании стоп-листа. Если бы это было не для секундомера the
в поисковой фразе, или если the
не считался секундомером, поиск будет работать нормально. Я действительно не могу объяснить это поведение, но я подозреваю, что он имеет какое-то отношение к тому, как вычисляются позиции слов. Я также подозреваю, что это не намеренное поведение.
Так что на ваш случай, Contains(*, '"Test O''neill 123"')
найдет совпадение, но поиск подстановочных знаков Contains(*, '"Test O''neill 123*"')
- нет. (Вы можете даже упростить поиск до Contains(*, '"O''neill*"')
, и вы увидите, что он по-прежнему не находит соответствия.) Комбинация стоп-слова O
с подстановочным знаком сталкивается с проблемой, которую я объяснил в последнем абзаце. Это суть проблемы, изложенной в вашем вопросе.
Решения начиная от наиболее эффективных наименее эффективного, но, возможно, более-практического обмена на Вашем случай:
1) Смена языка на вашем полнотекстовой индекс на английский язык и повторно индекс. Это приведет к тому, что O'neill
будет рассматриваться как одно слово, и, таким образом, вы избежите странного поведения подстановочных знаков, которые я объяснил.Вы можете изменить язык всех свойств индекса текста с помощью SQL Server Management Studio или путем удаления и воссоздания индекса следующим образом:
ALTER FULLTEXT INDEX ON MyTable DROP (Column1)
GO
ALTER FULLTEXT INDEX ON MyTable ADD (Column1 LANGUAGE [English])
-- repeat for each column in the index
2) Если вам нужно продолжать использовать нейтральный язык, рассмотреть возможность удаления O
из вашего стоп-лист и повторный индекс.
ALTER FULLTEXT STOPLIST MyStoplist DROP 'o' LANGUAGE 'Neutral';
3) Или не используйте стоп-лист, если он вам не нужен.
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
4) Если ни один из вышеупомянутых решений не практичны, рассмотреть возможность удаления из стоп-слов в поисковой фразе, или по крайней мере O'
префикс в фамилиях.
Вы избегаете '' 'правильно. Я не могу воспроизвести эту проблему с SQL Server 2014. Какую версию вы используете? – Keith
sql server 14 тоже .. может быть что-то о сортировке или языках? У меня нет подсказки, я не дБА, просто разработчик regualr, поэтому я не уверен, на что посмотреть .. –
Не уверен. В случае, если это помогает, я использую сопоставление SQL_Latin1_General_CP1_CI_AS, а язык - английский. – Keith