SQL Server FTS: возможно ли получить информацию о том, как / почему строки были сопоставлены? - PullRequest
4 голосов
/ 17 мая 2010

Можно ли получить информацию, почему / каким образом данная строка, возвращенная запросом FTS, была сопоставлена ​​(или какая подстрока вызвала совпадение строки)? Например, рассмотрим простейшую таблицу со столбцами id и text, с индексом FTS для более поздней.

SELECT * FROM Example
WHERE CONTAINS(text, 'FORMSOF(INFLECTIONAL, jump)');

Этот примерный запрос может вернуть, скажем, строку {1, 'Jumping Jack'}.

Теперь, возможно ли каким-то образом получить информацию, что этот самый ряд был найден из-за слова 'Jumping'? Это даже не должна быть точная информация, скорее , подстрока которой вызвала совпадение строки .

Почему я спрашиваю - у меня есть приложение C #, которое создает эти запросы на основе пользовательского ввода (ключевые слова для поиска), и мне нужна самая базовая информация, почему / как сопоставляется строка, для дальнейшего использования в коде C # ,

Если это невозможно, есть альтернативы?


РЕДАКТИРОВАТЬ в отношении ответов Майка Бертона и LesterDove:

Приведенный выше пример был тривиальным по очевидным причинам, и ваши решения в порядке, если учесть это, однако FTS-запросы могут возвращать результаты, в которых регулярное выражение или простое сопоставление строк (например, LIKE) не будут включены. Учтите:

Поиск bind возвращает bound (прошлая форма).
Поиск extraordinary возвращает amazing (синоним).

Оба действительных совпадения.

Я искал решения этой проблемы и нашел это: NHunspell . Тем не менее, я уже получил FTS и действительные результаты с использованием SQL Server, дублирующий аналогичный механизм (создание дополнительных индексов, хранение дополнительных слов / файлов тезауруса и т. Д.) Выглядит не очень хорошо.

Однако ответ Лестера дал мне некоторые идеи о том, что, возможно, я действительно смогу разбить исходную строку на временную таблицу и выполнить исходный запрос FTS для этого результата разбиения. Поскольку это может работать для моего случая (когда БД довольно мала, а запросы не очень сложны), в общем случае такой подход может быть вне вопроса.

Ответы [ 3 ]

2 голосов
/ 17 мая 2010

1 / Используйте функцию SPLIT (многие варианты могут быть Googled) в исходной подстроке, которая будет выгружать отдельные подстроки в временную таблицу некоторого вида, с одной строкой на фрагмент фрагмента.РЕДАКТИРОВАТЬ: вам нужно использовать CROSS APPLY, чтобы присоединиться к табличной функции:

SELECT * FROM Example E CROSS APPLY Split(E.text, ' ') AS S 
WHERE CONTAINS(E.text, 'FORMSOF(INFLECTIONAL, jump)') AND S.String LIKE '%jump%';

* ПРИМЕЧАНИЕ: вам нужно добыть для вашей собственной пользовательской функции Split.Я использовал этот и применил редактирование первого комментатора, чтобы разрешить использование пробела в качестве разделителя.

Итак, E - ваша таблица примеров.Вы все еще ищете в текстовом поле слово «прыжок».И теперь вы «соединяетесь» с таблицей, состоящей из отдельных значений подстроки вашего текстового поля.Наконец, вы сравниваете это со словом «прыжок», используя LIKE или Instr.

1 голос
/ 27 августа 2010

Вы можете заставить SQL рассказать, как он интерпретировал ваш запрос, включая то, как он изменил ваш ввод.

SELECT occurrence, special_term, display_term, expansion_type, source_term 
FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, bind)', 1033, 0, 0)

возвращает

occurrence  special_term    display_term    expansion_type  source_term
1            Exact Match     binds           2          bind
1            Exact Match     binding         2          bind
1            Exact Match     bound           2          bind
1            Exact Match     bind            0          bind

Это не совсем то, что вы просили, но это начало. Вы можете найти в своих результатах что-нибудь в столбце display_term и, возможно, выяснить, почему оно соответствует.

1 голос
/ 17 мая 2010

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

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