c# - SQL 服务器 FTS : possible to get information how/why rows were matched?

标签 c# sql sql-server-2008 full-text-search

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

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

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

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

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

如果不可能,还有其他选择吗?


编辑 Mike Burton 和 LesterDove 的回复:

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

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

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

相关文章:

sql - 如何更新所选数据库中所有过程中公共(public)参数的数据类型

c# - 有没有办法用 ToolboxBitmap 实现真正的透明度?

c# - 从容器中删除控件的最干净的方法是什么?

mysql - 学习如何连接表,但收到错误消息 "Not unique table"

sql-server-2005 - 如何根据我的条件对包含某些字段的表格进行排序

sql - 无法更新逻辑表 INSERTED 和 DELETED

sql-server-2008 - 在TransactionScope中消耗的连接池连接

c# - 订购(排序)我的列表集合的 Lambda 表达式

javascript - 如何根据级联下拉列表所选值从数据库获取属性值?

sql - 记录链接到任何表?