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

时间:2010-09-07 20:24:05

标签: sql sql-server tsql full-text-search

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

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

这对于找到包含像“大脑”这样的词语(例如“大脑”,“大脑”)这样的描述的行非常有用。但是,当我向用户显示这些结果时,我想突出显示与其查询匹配的单词(就像Google一样)。但我不能只在结果中寻找搜索词:如果结果包含“大脑”,我显然无法突出“大脑”。

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

2 个答案:

答案 0 :(得分:3)

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匹配的地方要多得多,但它确实如此。

答案 1 :(得分:0)

结果列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