繁体   English   中英

SQL函数确定最准确的结果

[英]SQL function to determine the most accurate result

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

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

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

我做一个喜欢的查询

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

有没有办法判断哪个结果最准确?

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

CONTAINSTABLE生成的表包括名为RANK的列。 RANK列是每行的值(从0到1000),指示行与选择标准的匹配程度。 通常在SELECT语句中以下列方式之一使用此等级值:

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

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

您可以尝试使用相似性指标来获得与搜索字符串相比每个结果的距离得分。 SOUNDEX等为您提供了一些原始选择,但是根据您的要求,还有更多更复杂的选择。 SimMetrics函数库允许您按汉明距离,Levenshtein距离等比较字符串。这是一篇详尽的文章,介绍了该库的安装和用法。

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

例如,运行以下查询:

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

'dock'和'dock'之差为4,这是最好的结果; 'dock'和'docakble'是2,这是一个更高的差异。

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

包含

WHERE CONTAINS(word, 'dock') 

自由文本

WHERE FREETEXT (word, 'dock') 

建立索引后,这些索引的速度将比LIKE快,而FTS包括基于排名匹配算法的分数值。 您必须测试并查看结果是否符合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM