Полнотекстовый поиск не находит некоторые префиксы

Я использую возможности полнотекстового поиска SQL Server 2014 для поиска документов в базе данных, начинающихся с заданного префикса. Однако некоторые запросы не дают никаких результатов, хотя должны.

Возьмем следующий пример:

SELECT * FROM [Profile].[DocumentView] WHERE CONTAINS(Content, '"Friedenseins*"')

(24 row(s) affected)

SELECT * FROM [Profile].[DocumentView] WHERE CONTAINS(Content, '"Friedensein*"')

(0 row(s) affected)

SELECT * FROM [Profile].[DocumentView] WHERE CONTAINS(Content, '"Friedensei*"')

(29 row(s) affected)

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

РЕДАКТИРОВАТЬ:
Предложение использовать вместо этого FREETEXT не является решением для этого конкретного случая, так как мне нужна функция поиска близости CONTAINS.


person Mathias Becher    schedule 18.11.2014    source источник
comment
Означает, что у вас нет слова в столбце «Содержание» со следующим (Friedensein), но у вас есть слова в столбце со следующим началом (Friedenseins, Friedensei).   -  person knkarthick24    schedule 18.11.2014
comment
Целевое слово на самом деле Friedenseinsätze, которое находится по первому и третьему запросу, но не по второму.   -  person Mathias Becher    schedule 18.11.2014
comment
Никогда не сталкивался с такой ситуацией, хотелось бы услышать от экспертов. +1   -  person knkarthick24    schedule 18.11.2014
comment
Я поместил образец DDL и воспроизвел проблему на SQL Fiddle   -  person GarethD    schedule 18.11.2014
comment
Я создал задачу в Connect: connect.microsoft.com/SQLServer/feedback/details/1032815   -  person Mathias Becher    schedule 18.11.2014
comment
Действительно странно. Измените эту первую букву с F на G, и вдруг это сработает. Я играл с sqlfiddle и обнаружил ту же проблему, используя английский язык вместо немецкого. Я довольно много работал с полным текстом SQL Server и никогда не видел ничего подобного!   -  person Keith    schedule 03.12.2014
comment
См. ссылку для подключения к ответу от Microsoft.   -  person Mathias Becher    schedule 16.12.2014
comment
Пожалуйста, рассмотрите возможность публикации самостоятельного ответа, так как теперь у вас есть объяснение.   -  person Martin Smith    schedule 28.12.2014


Ответы (2)


Спасибо, что разместили этот вопрос, Матиас. Я просто хотел указать на предложение Microsoft (через https://connect.microsoft.com/SQLServer/feedback/details/1032815) должен был переключиться на формат

 SELECT * FROM [Profile].[DocumentView] WHERE FREETEXT(Content, '"Friedensein*"')

Хотя это и не помогает Матиасу, но помогло мне и может помочь читателю.

В моем случае у меня возникла проблема с поиском строки даты, хранящейся в текстовом поле (nvarchar). Мой простой пример заключался в том, что это НЕ РАБОТАЕТ:

select * from Sample
where CONTAINS(*, '"1/5/2015*"')

... ничего не возвращает. Однако, когда я переключаюсь на FREETEXT следующим образом, он возвращается, как и ожидалось.

select * from Sample
where FREETEXT(*, '"1/5/2015*"')

Я также использую SQL 2014. Пожалуйста, проголосуйте за ссылку MS Connect, если у вас также возникла эта проблема.

ОБНОВЛЕНИЕ 08.01.2015:

С тех пор я обнаружил, что это решение не работает в моем случае, поскольку FREETEXT возвращает другие значения даты, которые «похожи» или так кажутся. В моем примере от 05.01.2015 выше я также получаю ответные обращения 02.01.2015, 06.01.2015 и так далее. На самом деле, если я запрошу 05.12.2014 (предыдущий год), я получу совпадения в течение всего года, поэтому «похожее» в этом случае, похоже, определяется годом.

Для справки, вот документация по SQL: http://msdn.microsoft.com/en-us/library/ms176078.aspx

person ebol2000    schedule 08.01.2015

Проблема заключается в средствах разбиения слов, которые не включают идентификатор фразы, поэтому второй запрос преобразуется в эквивалент (псевдо-SQL)

SELECT * FROM [Profile].[DocumentView] WHERE Content LIKE
    ((friedensein* OR frieden*) in Position 1) AND (sein* in Position 2)

Но «Friedenseinsätze» имеет «einsätze» в позиции 2. С правильным идентификатором фразы запрос станет

SELECT * FROM [Profile].[DocumentView] WHERE Content LIKE
    ((friedensein* in Position 1) OR ((frieden* in Position 1) AND (sein* in Position 2)))

Команда офиса была проинформирована. Connect Thread будет обновляться при появлении новой информации. .

ОБНОВЛЕНИЕ: проблема была решена как Не исправим.

person Mathias Becher    schedule 08.01.2015