Я использую запрос CONTAINSTABLE с механизмом полнотекстового индексирования MS SQL Server для поиска в текстовом столбце; например.:
SELECT *
FROM MyTable
INNER MERGE JOIN CONTAINSTABLE(MyTable, sDescription, 'FORMSOF(INFLECTIONAL, "brains")')
AS TBL1 ON TBL1.[key]=MyTable.ixKey
Он отлично справляется с поиском строк с описанием, включающим такое слово, как "мозг" (например, "мозг", "мозговой"). Однако, когда я показываю эти результаты пользователю, я хотел бы выделить слово, соответствующее их запросу (точно так же, как Google). Но я не могу просто искать поисковый запрос в результатах: если результат содержит "мозг", я, очевидно, не могу выделить "мозги".
Может ли SQL Server сказать мне, где в столбце (слово или символ) встречается полнотекстовое совпадение? Как вариант, могу ли я вручную запустить стеммер, чтобы получить все формы поискового запроса? Тогда я мог бы выделить каждый из них по отдельности.
Ответ 1 · рейтинг 4 · kevingessner
SQL Server 2008 включает функцию для получения измененных форм слова или фразы с использованием синтаксического анализатора полнотекстового механизма: _ 1_.
SELECT display_term, source_term, occurrence FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "brains")', 1033, 0, 0)
получает таблицу вроде:
display_term | source_term | occurrence
---------------------------------------
brain | brains | 1
brains | brains | 1
brained | brained | 1
(Работа с фразами запроса - это немного сложнее, поскольку каждое слово изменяется отдельно, но собрать все вместе не так уж сложно.)
Теперь я могу просто выделить любое появление любой из измененных форм. Это немного сложнее, чем если бы SQL Server просто сказал мне, где находятся совпадения FTS, но это подойдет.
Ответ 2 · Cris Cuadras
На это указывает значение в столбце результатов expansion_type. Тип раскрытия 2 - ИНФЛЕКЦИОННЫЙ, 4 указывает на расширение ключевых слов тезауруса:
FORMSOF(THESAURUS, "Co")
source_term display_term expansion_type
Co co 0
Co company 4
FORMSOF(INFLECTIONAL, "Dog")
source_term display_term expansion_type
Dog dog 0
Dog dogs 2
Dog dogged 2
Dog dogging 2
SQL
SELECT
source_term,
display_term,
expansion_type
FROM sys.dm_fts_parser (FORMSOF(INFLECTIONAL, "Dog"), 1033, 0, 0)
order by source_term, expansion_type