2015-09-04 4 views
3

У меня есть таблица с полем имени с этимполнотекстового поиска - Содержит плюс подстановочные и одиночные кавычки

Test O'neill 123 

Если я использую

SELECT * 
    FROM table F 
    WHERE CONTAINS (F.*, '"Test O''neill 123"') 

он работает нормально, но если я использую подстановочные * Я не получаю никаких результатов.

SELECT * 
    FROM table f 
    WHERE CONTAINS (F.*, '"Test O''neill 123*"') 

Почему это? Я использую парсер для моих условий поиска, и это добавление подстановочных *

Я проверил несколько сайтов, о возможности избежать ' но я ничего называют это не нашел ..

Заранее спасибо

+0

Вы избегаете '' 'правильно. Я не могу воспроизвести эту проблему с SQL Server 2014. Какую версию вы используете? – Keith

+0

sql server 14 тоже .. может быть что-то о сортировке или языках? У меня нет подсказки, я не дБА, просто разработчик regualr, поэтому я не уверен, на что посмотреть .. –

+0

Не уверен. В случае, если это помогает, я использую сопоставление SQL_Latin1_General_CP1_CI_AS, а язык - английский. – Keith

ответ

4

Проблема связана с комбинацией 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' префикс в фамилиях.

 Смежные вопросы

  • Нет связанных вопросов^_^