如何在 FORMSOF 变形全文搜索中获得匹配的位置?

Posted

技术标签:

【中文标题】如何在 FORMSOF 变形全文搜索中获得匹配的位置?【英文标题】:How do I get the position of the match in a FORMSOF INFLECTIONAL full-text search? 【发布时间】:2010-09-07 20:24:04 【问题描述】:

我正在使用带有 MS SQL Server 全文索引引擎的 CONTAINSTABLE 查询在文本列中进行搜索;例如:

SELECT * 
FROM MyTable
INNER MERGE JOIN CONTAINSTABLE(MyTable, sDescription, 'FORMSOF(INFLECTIONAL, "brains")')
    AS TBL1 ON TBL1.[key]=MyTable.ixKey

这可以很好地找到描述中包含“大脑”之类的词(例如“大脑”、“大脑”)的行。但是,当我向用户显示这些结果时,我想突出显示与他们的查询匹配的单词(就像 Google 一样)。但我不能只在结果中查找搜索词:如果结果包含“大脑”,我显然无法突出显示“大脑”。

SQL Server 能否告诉我全文匹配发生在列(单词或字符)的哪个位置?或者,我可以手动运行词干分析器来获取搜索词的所有形式吗?那么,我可以单独突出显示其中的每一个。

【问题讨论】:

【参考方案1】:

SQL Server 2008 包含一个使用全文引擎解析器获取单词或短语的变形形式的函数:sys.dm_fts_parser

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】:

结果列中的值expansion_type 表明了这一点。 扩展类型 2 为 INFLECTIONAL,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

【讨论】:

以上是关于如何在 FORMSOF 变形全文搜索中获得匹配的位置?的主要内容,如果未能解决你的问题,请参考以下文章

全文匹配的各种搜索算法和性能

mysql全文匹配搜索字串中含圆括号()怎么办?

全文本搜索

为啥 SQL Server 全文搜索不匹配数字?

如何提高sql2000全文检索搜索效率

使用 Postgres 全文搜索搜索完全匹配的最佳方法是啥?