如何在SQL服务器中找到与给定字符串相似的字符串



我有一个SQL server表,其中包含几个字符串列。我需要写一个应用程序,它得到一个字符串,并在SQL server表中搜索类似的字符串。

例如,如果我给出"مختار"或"مختر"作为输入字符串,我应该从SQL表中得到这些:

1 - مختاری
2 - شهاب مختاری
3 - شهاب الدین مختاری

我已经在网上搜索了一个解决方案,但我没有找到有用的。我读过这个问题,但这对我没有帮助,因为:

    我使用的是MS SQL Server而不是MySQL
  1. 我的表内容是波斯语的,所以我不能使用Levenshtein距离和类似的方法
  2. 我更喜欢SQL Server解决方案,而不是索引或基于守护进程的解决方案。

最好的解决方案是帮助我们根据相似性对结果进行排序,但是,这是可选的。

你对此有什么建议吗?

谢谢

MSSQL支持LIKE,这似乎应该工作。有什么原因不适合你的项目吗?

SELECT * FROM table WHERE input LIKE '%مختار%'

嗯…考虑到你读了另一篇文章,你可能已经知道了like运算符……也许你的问题是"获得字符串和搜索类似的东西"?

--This part searches for a string you want
declare @MyString varchar(max)
set @MyString = (Select column from table
where **LOGIC TO FIND THE STRING GOES HERE**)

--This part searches for that string
select searchColumn, ABS(Len(searchColumn) - Len(@MyString)) as Similarity
from table where data LIKE '%' + @MyString + '%'
Order by Similarity, searchColumn

相似性部分是类似于你发布的东西。如果字符串"更相似"意味着它们具有相似的长度,那么它们将在结果查询中排名更高。显然,绝对部分可以避免,但我还是这样做了,以防万一。

希望有帮助=-)

like运算符外,还可以使用条件WHERE instr(columnname, search) > 0;然而,这通常比较慢。它所做的是返回一个字符串在另一个字符串中的起始位置。因此,如果在ABCDEFG中搜索CD,它将返回3。3>0,因此将返回记录。然而,在你描述的情况下,喜欢似乎是最好的解决方案。

一般的问题是,在语言中,相同的字母在单词的开头,中间和结尾有不同的书写形式,因此-不同的代码-我们可以尝试使用特定的波斯语排序,但通常这是没有用的。

第二个选择-是使用SQL FTS功能,但同样-如果它没有针对该语言的特殊语言模块-它就不那么有用了。

和最一般的方法-使用自己的语言处理-这是非常复杂的任务。下一个关键词和谷歌可以帮助理解问题的大小:DLP,单词和术语,双格,n格,语法和词形变化

尝试使用内置的Soundex()和Difference()函数。我希望他们在波斯语中工作得很好。

看下面的参考:http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into-mds/

Similarity()函数可以帮助您按相似性排序结果(如您在问题中所问),也可以使用与Levenshtein不同的算法编辑距离取决于@method算法的值:

0 Levenshtein编辑距离算法

1 Jaccard相似系数算法

Jaro-Winkler距离算法的一种形式

3最长公共子序列算法

类操作符可能不执行他所要求的操作。例如,如果我有一个记录值"请,我想问一个问题'在我的数据库记录。让我们说,在我的查询,我想找到一个匹配的相似性像这样"我可以问一个问题,拜托"。Like运算符可以使用Like %[your sentence]或[your sentence]%来完成此操作,但不建议将其用于字符串相似度,因为句子可能会更改,并且所有的Like逻辑都可能无法获取匹配记录。建议使用朴素贝叶斯文本分类对相似度进行分类,为句子分配标签,或者您可以尝试MSSQL服务器

中的语义搜索功能。

最新更新