2010-05-17 40 views
4

是否有可能获得信息为什么/如何给予由FTS查询返回的行匹配(或哪些子字符串导致行匹配)? 例如,考虑最简单的表格,其中idtext列,FTS索引在后面一列。SQL Server FTS:可能获取信息行/列的匹配方式?

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

此实施例一查询可以返回,说行{1, 'Jumping Jack'}

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

为什么我问 - 我得到了C#应用程序,该应用程序基于用户输入(要搜索的关键字)构建这些查询,并且我需要非常基本的信息为什么/如何匹配行,以便在C#码。

如果这是不可能的,任何替代品?


编辑在迈克·波顿的问候和LesterDove的答复:

上面的例子是微不足道的,原因很明显,你的解决方案是确定具有记住,但是FTS查询可能返回结果,其中正则表达式或简单的字符串匹配(如:LIKE)将不会在削减考虑:

搜索bind回报bound(过去式)。
搜索extraordinary返回amazing(同义词)。

两个有效匹配。

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

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

+0

感谢 - FT寻找临时表的想法是我放弃这个想法的地方。我会回头看看你想出什么。 – LesterDove 2010-05-17 20:55:19

回答

2

1 /你原来的字符串使用分割功能(很多变化可以用谷歌搜索),这将转储个别子成某种形式的临时表,每个子片段一行。

2 /编辑:您需要使用CROSS申请加入到表值函数:

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上搜索单词'jump'的文本字段。现在,您正在“加入”一个包含文本字段的各个子字符串值的表格。最后,通过使用LIKEInstr来匹配单词'jump'。

1

一个简单的后处理方法是为每个WHERE子句项生成一个等效的正则表达式,并用它来发现事后如何找到的数据匹配指定的模式。

1

你可以通过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 

这不正是你问什么,但它是一个开始。你可以在display_term列搜索你的结果,并找出匹配的原因。