是否可以获得信息为什么/如何匹配 FTS 查询返回的给定行(或哪个子字符串导致行匹配)?
例如,考虑具有 idtext 列的最简单表,FTS 索引位于后一个。

SELECT * FROM Example
WHERE CONTAINS(text, 'FORMSOF(INFLECTIONAL, jump)');

这个示例查询可以返回,比如 row {1, 'Jumping Jack'}

现在,是否有可能以某种方式获得由于 'Jumping' 字而匹配这一行的信息?它甚至不必是确切的信息,更多的是 哪个子字符串导致行匹配

为什么我要问 - 我有一个 C# 应用程序,它根据用户输入(要搜索的关键字)构建这些查询,我需要非常基本的信息,为什么/如何匹配行,以便在 C# 代码中进一步使用。

如果不可能,有什么替代方案吗?

编辑关于 Mike Burton 和 LesterDove 的回复:

由于显而易见的原因,上面的示例是微不足道的,考虑到这一点,您的解决方案是可以的,但是 FTS 查询可能会返回正则表达式或简单字符串匹配(例如 LIKE )不会插入的结果。考虑:



两个有效匹配。

我一直在寻找这个问题的解决方案,发现了这个: NHunspell 。但是,我已经使用 SQL Server 获得了 FTS 和有效结果,复制类似的机制(构建额外的索引、存储额外的单词/thezaurus 文件等)看起来并不好。

然而,莱斯特的回答给了我一些想法,也许我确实可以将原始字符串拆分到临时表,并在此拆分结果上运行原始 FTS 查询。因为它可能适用于我的情况(其中 DB 相当小并且查询不是很复杂),所以在一般情况下,这种方法可能是不可能的。

最佳答案

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 在文本字段中搜索“跳跃”一词。现在您正在“加入”到由文本字段的各个子字符串值组成的表格。最后,您使用 LIKEInstr 将其与单词“jump”进行匹配。

关于c# - SQL Server FTS : possible to get information how/why rows were matched?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2851578/

10-11 10:36