SQL函数确定最准确的结果

时间:2010-08-08 19:30:14

标签: sql sql-server tsql

如果我有这样的桌子......

create table #words (
id int identity,
word varchar(1024)
)

insert into #words (word) values ('dock')
insert into #words (word) values ('dockable')

我做了一个LIKE查询

select id, word from #words where word like '%dock%'

有没有办法告诉哪个结果最准确?

4 个答案:

答案 0 :(得分:4)

对于复杂的多字标准,您应使用全文搜索和CONTAINSTABLE。此表函数的输出包含RANK列:

  

CONTAINSTABLE生成的表格   包括一个名为RANK的列。 RANK   列是一个值(从0到   1000)每行表示如何   一行符合选择标准。   该等级值通常用于   SELECT中的其中一种方式   语句:

     
      
  • ORDER BY子句中返回排名最高的行作为第一行   在表中。
  •   
  • 在选择列表中查看分配给每一行的排名值。
  •   

对于简单的单字标准,您应该在SQL CLR中实现Levenshtein distance函数,并使用它来查找最相似的最佳匹配单词(或使用Ken Redler的链接项目中的单词)。

答案 1 :(得分:2)

与搜索字符串相比,您可以尝试使用相似性指标来获取每个结果的距离分数。 SOUNDEX等为您提供了一些原始选项,但根据您的要求,还有更复杂的选择。 SimMetrics library of functions允许您通过汉明距离,Levenshtein距离等比较字符串。这是一个描述库的安装和使用的thorough article

答案 2 :(得分:1)

您可以使用SOUNDEX and DIFFERENCE T-SQL函数来比较单词,但您可能仍需要一种方法来确定哪种“最准确”。

例如,运行以下查询:

SELECT DIFFERENCE('dock','dock');
SELECT DIFFERENCE('dock','dockable');

'dock'和'dock'的区别是4,这是最好的结果; 'dock'和'docakble'是2,这是一个更大的差异。

答案 3 :(得分:1)

我会考虑使用全文搜索(FTS) - CONTAINSFREETEXT更精确

包含

WHERE CONTAINS(word, 'dock') 

FREETEXT

WHERE FREETEXT (word, 'dock') 

索引,这些将比LIKE更快,并且FTS包括基于算法的得分值以对匹配进行排名。你必须测试&看看结果是否符合您的需求。