我正在使用带有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能告诉我全文匹配发生在列(字或字符)的哪个位置?或者,我可以手动运行词干分析器来获取搜索词的所有形式吗?我可以单独突出显示每一个。
答案 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