Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: kevingessnerОтветов: 2

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

sqlsql-serverfull-text-searchtsql

Ответы

Ответ 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы