如何在SQL Server中查找与给定字符串类似的字符串?

时间:2011-12-26 15:11:02

标签: sql sql-server sorting similarity

我有一个SQL服务器表,其中包含多个字符串列。我需要编写一个获取字符串并在SQL服务器表中搜索类似字符串的应用程序。

例如,如果我将“مختار”或“مختر”作为输入字符串,我应该从SQL表中获取这些:

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

我在网上搜索了一个解决方案,但我发现没什么用处。我读过this question,但这对我没有帮助,因为:

  1. 我使用的是MS SQL Server而不是MySQL
  2. 我的桌子内容是波斯语,所以我不能使用Levenshtein距离和类似的方法
  3. 我更喜欢仅使用SQL Server的解决方案,而不是基于索引或守护程序的解决方案。
  4. 最好的解决方案是帮助我们按相似性对结果进行排序的解决方案,但是,它是可选的。

    你有什么建议吗?

    由于

6 个答案:

答案 0 :(得分:4)

MSSQL支持LIKE,它似乎应该可以工作。是否有理由不适合您的计划?

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

答案 1 :(得分:3)

嗯..考虑到你读了另一篇文章,你可能已经知道了类似的操作员......也许你的问题是“获取字符串并搜索类似的东西”?

--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

相似性部分类似于您发布的内容。如果字符串“更相似”意味着它们具有相似的长度,则它们在结果查询中会更高。 绝对部分可以明显避免,但我是为了以防万一。

希望有帮助= - )

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

第二个选项 - 使用SQL FTS功能,但是再次 - 如果它没有特定的语言模块 - 它就没用了。

最通用的方式 - 使用您自己的语言处理 - 完全非常复杂任务。接下来的关键字和谷歌可以帮助理解问题的大小:DLP,单词和术语,双语法,n语法,语法和形态变化

答案 4 :(得分:0)

尝试使用内置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相似系数算法

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

3最长公共子序列算法

答案 5 :(得分:0)

Like 操作员可能不会做他所要求的。例如,如果我在我的数据库记录中有一个记录值“请,我想问一个问题”。让我们说我的查询,我想找到这样的匹配相似度“我可以问一个问题,请” . like 操作符可能会使用 like %[your senttence] 或 [your sentence]% 来执行此操作,但不建议将其用于字符串相似性 cos 句子可能会更改,并且您的所有 like 逻辑可能无法获取匹配的记录。建议使用使用朴素贝叶斯文本分类进行相似性为句子分配标签,或者您可以尝试 MSSQL 服务器中的语义搜索功能