是否有可能获取 FTS 查询返回的给定行为何/如何匹配(或哪个子字符串导致行匹配)的信息?
例如,考虑具有 id
和 text
列的最简单的表,在后者上有 FTS 索引。
SELECT * FROM Example
WHERE CONTAINS(text, 'FORMSOF(INFLECTIONAL, jump)');
这个示例查询可以返回,比如 {1, 'Jumping Jack'}
行。
现在,是否有可能以某种方式获得这一行由于 'Jumping'
字词而匹配的信息?它甚至不必是准确的信息,更多的是哪个子字符串导致行匹配。
为什么我要问 - 我得到了 C# 应用程序,它根据用户输入(要搜索的关键字)构建这些查询,我需要非常基本的信息,为什么/如何匹配行,以便在 C# 代码中进一步使用.
如果不可能,还有其他选择吗?
编辑 Mike Burton 和 LesterDove 的回复:
由于显而易见的原因,上面的示例是微不足道的,考虑到这一点,您的解决方案是可以的,但是 FTS 查询可能会返回正则表达式或简单字符串匹配(例如 LIKE
)不会切入的结果. 考虑:
Search for
bind
returnsbound
(past form).
Search forextraordinary
returnsamazing
(synonym).
两个有效匹配项。
我一直在寻找这个问题的解决方案并找到了这个:NHunspell .但是,我已经使用 SQL Server 获得了 FTS 和有效结果,复制类似机制(构建额外的索引、存储额外的单词/thezaurus 文件等)看起来不太好。
然而,Lester 的回答给了我一些想法,也许我确实可以将原始字符串拆分为临时表,并在该拆分结果上运行原始 FTS 查询。因为它可能适用于我的情况(数据库相当小且查询不是很复杂),所以在一般情况下这种方法可能是没有问题的。
最佳答案
1/在您的原始子字符串上使用 SPLIT 函数(许多变体可以通过 Google 搜索),这会将各个子字符串转储到某种临时表中,每个子字符串片段一行。
2/编辑:您需要使用 CROSS APPLY 来连接表值函数:
SELECT * FROM Example E CROSS APPLY Split(E.text, ' ') AS S
WHERE CONTAINS(E.text, 'FORMSOF(INFLECTIONAL, jump)') AND S.String LIKE '%jump%';
*注意:您需要寻找您自己的用户定义的拆分功能。我用了this one并应用第一个评论者的编辑以允许将空格字符作为分隔符。
因此,E 是您的示例表。您仍在 FT 的文本字段中搜索“跳跃”一词。现在您正在“加入”到一个由文本字段的各个子字符串值组成的表。最后,您使用 LIKE
或 Instr
将其与单词“jump”进行匹配。
关于c# - SQL 服务器 FTS : possible to get information how/why rows were matched?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2851578/