2011-12-26 54 views
2

我有一个包含多个字符串列的SQL服务器表。我需要编写一个应用程序,它获取一个字符串并在SQL Server表中搜索类似的字符串。如何查找与SQL Server中给定字符串类似的字符串?

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

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

我搜索网的解决方案,但我发现没有用处。我读过this question,但因为这不会帮助我:

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

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

你有什么建议吗?

感谢

回答

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 

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

希望帮助= - )

+0

是的,它更接近我在找什么。但考虑到相似因素的长度不是一个好主意。例如“测试”和“发现”根本不相似,但它们的长度是相等的。 – KiNG 2011-12-27 09:43:11

+0

但是等一下,如果您搜索“test”,那么我编写的查询将不会提供“find”作为结果。 如果你搜索“测试”,并有“测试”,“寻找”,“测试”,并在你的数据库“测试”,结果将是: 测试 仪 测试 的顺序。如果您搜索“查找”,则只会提供1个结果(查找)。如果搜索“in”,将提供两个结果: 找到 测试 (按该顺序,由于长度的原因)。我不知道波斯语,但是如果您使用的是nvarchar列,那么无论您使用哪种语言,结果都是相同的。 – Gaspa79 2011-12-28 04:34:16

+0

哦,是的,对不起,我没有看到'where'条款。但它仍然不能解决我的问题,因为我希望_find_与_fnd_匹配。 – KiNG 2011-12-28 08:41:20

4

MSSQL支持LIKE这似乎像它应该工作。有没有理由不适合你的程序?

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

其中输入LIKE '%مختار%' 也许?不等于... – xQbert 2011-12-26 15:19:18

+0

对不起,没有想到:)只是看到它。 – keyboardP 2011-12-26 15:19:52

+0

感谢您的回复,但'LIKE'不是我要找的。我也想为他们匹配“مختر”! – KiNG 2011-12-27 09:39:15

1

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

+0

SQL Server中没有'instr'函数。也许你的意思是'SUBSTRING'也是(authoratitive)引用“通常较慢”所需要的。如果'LIKE'表达式具有前导通配符,则表现应该不同的明显原因。两者都必须做同样的工作。 – 2011-12-26 15:56:54

+0

感谢您的回复,但'LIKE'和'SUBSTRING'不是我要找的。我也想为他们匹配“مختر”! – KiNG 2011-12-27 09:39:49

1

一般问题是,在相同字母在单词的开始,中间和结尾处以及因此 - 不同代码的语言中,我们可以尝试使用特定的波斯语整理,但一般来说,总体问题是这不会帮助。

第二种选择是使用SQL FTS功能,但是如果它没有语言的特殊语言模块,它就没有多大用处。

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

+0

感谢Oleg,但我认为FTS可以提供​​帮助,因为波斯语字母与阿拉伯字母过于相似,FTS应该支持阿拉伯语。但我不知道如何使用FTS来解决这个问题。 :( – KiNG 2011-12-27 09:45:22

+0

你想让我用Fts的例子填满答案吗? – 2011-12-27 10:08:19

+1

不,我试着用FTS的阿拉伯语模块试试你的字符串 - 它根本就不工作,对不起,所以 - 欢迎来到自然语言处理的世界8-) – 2011-12-27 11:26:35

0

尝试使用内置的Soundex()和差()函数。我希望他们对波斯工作正常。

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

相似()函数帮助您通过相似度排序结果(如你在你的问题问),它也可以利用的Levenshtein编辑距离取决于不同的算法关于价值@method算法:

0的Levenshtein编辑距离算法

1所述的Jaccard相似系数算法

2哈罗-温克勒距离算法

3最长公共子序列算法的形式

相关问题