Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server FTS:可以获取行匹配方式/原因的信息吗?_C#_Sql_Sql Server 2008_Full Text Search - Fatal编程技术网

C# SQL Server FTS:可以获取行匹配方式/原因的信息吗?

C# SQL Server FTS:可以获取行匹配方式/原因的信息吗?,c#,sql,sql-server-2008,full-text-search,C#,Sql,Sql Server 2008,Full Text Search,是否有可能获得FTS查询返回的给定行为何匹配/如何匹配的信息(或哪个子字符串导致行匹配)? 例如,考虑最简单的表,使用 ID 和文本< /代码>列,后面的FTS索引。p> SELECT * FROM Example WHERE CONTAINS(text, 'FORMSOF(INFLECTIONAL, jump)'); 这个示例查询可以返回,比如行{1,'Jumping Jack'} 现在,是否有可能以某种方式获得由于'Jumping'word而匹配这一行的信息?它甚至不必是精确的信息,更多的

是否有可能获得FTS查询返回的给定行为何匹配/如何匹配的信息(或哪个子字符串导致行匹配)? 例如,考虑最简单的表,使用<代码> ID <代码>和<代码>文本< /代码>列,后面的FTS索引。p>
SELECT * FROM Example
WHERE CONTAINS(text, 'FORMSOF(INFLECTIONAL, jump)');
这个示例查询可以返回,比如行
{1,'Jumping Jack'}

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

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

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


编辑Mike Burton和LesterDove的回复:

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

搜索
bind
返回
bind
(过去形式)。
搜索
非凡
返回
惊人
(同义词)

两者都是有效的匹配项

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


然而,Lester的回答给了我一些想法,也许我确实可以将原始字符串拆分为临时表,并对拆分结果运行原始FTS查询。因为它可能适用于我的情况(数据库相当小,查询不是很复杂),在一般情况下,这种方法可能是不存在问题的。

一种简单的后处理方法是为每个WHERE子句文章生成一个等价的正则表达式,并使用它来发现发现的数据如何与指定的模式匹配

1/在原始子字符串上使用拆分函数(许多变体可以通过谷歌搜索),该函数将单个子字符串转储到某种临时表中,每个子字符串片段一行

2/编辑:您需要使用交叉应用连接到表值函数:

SELECT * FROM Example E CROSS APPLY Split(E.text, ' ') AS S 
WHERE CONTAINS(E.text, 'FORMSOF(INFLECTIONAL, jump)') AND S.String LIKE '%jump%';
*注意:您需要寻找自己的用户定义的拆分函数。我使用并应用了第一个注释者的编辑,以允许空格字符作为分隔符


因此,E是您的示例表。您仍在文本字段中搜索单词“jump”。现在,您正在“连接”到一个由文本字段的各个子字符串值组成的表。最后,通过使用
LIKE
Instr
将其与单词“jump”进行匹配,您可以让SQL告诉您它是如何解释您的查询的,包括它是如何转换您的输入的

SELECT occurrence, special_term, display_term, expansion_type, source_term 
FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, bind)', 1033, 0, 0)
返回

occurrence  special_term    display_term    expansion_type  source_term
1            Exact Match     binds           2          bind
1            Exact Match     binding         2          bind
1            Exact Match     bound           2          bind
1            Exact Match     bind            0          bind

这并不是你想要的,但这只是一个开始。您可以在“显示项”列中搜索结果中的任何内容,并可能找出匹配的原因

谢谢-在FT搜索临时表的想法周围的某个地方,我也放弃了这个想法。我会回来看看你有什么想法。