Как мне узнать позицию совпадения в FORMSOF INFLECTIONAL полнотекстовом поиске?

Я использую запрос 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 сказать мне, где в столбце (слово или символ) встречается полнотекстовое совпадение? Как вариант, могу ли я вручную запустить стеммер, чтобы получить все формы поискового запроса? Тогда я мог бы выделить каждый из них по отдельности.


person kevingessner    schedule 07.09.2010    source источник


Ответы (2)


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, но это подойдет.

person kevingessner    schedule 08.09.2010

На это указывает значение в столбце результатов 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
person Cris Cuadras    schedule 22.10.2013