如何在 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 变形全文搜索中获得匹配的位置?的主要内容,如果未能解决你的问题,请参考以下文章