我有一个SQL服务器表,其中包含多个字符串列。我需要编写一个获取字符串并在SQL服务器表中搜索类似字符串的应用程序。
例如,如果我将“مختار”或“مختر”作为输入字符串,我应该从SQL表中获取这些:
1 - مختاری
2 - شهاب مختاری
3 - شهاب الدین مختاری
我在网上搜索了一个解决方案,但我发现没什么用处。我读过this question,但这对我没有帮助,因为:
最好的解决方案是帮助我们按相似性对结果进行排序的解决方案,但是,它是可选的。
你有什么建议吗?
由于
答案 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()函数。我希望他们能为波斯人工作。
Similarity()函数可帮助您按相似性对结果进行排序(如您在问题中所述),并且使用与Levenshtein编辑距离不同的算法也可能取决于@method算法的值:
0 Levenshtein编辑距离算法
1 Jaccard相似系数算法
2 Jaro-Winkler距离算法的一种形式
3最长公共子序列算法
答案 5 :(得分:0)
Like 操作员可能不会做他所要求的。例如,如果我在我的数据库记录中有一个记录值“请,我想问一个问题”。让我们说我的查询,我想找到这样的匹配相似度“我可以问一个问题,请” . like 操作符可能会使用 like %[your senttence] 或 [your sentence]% 来执行此操作,但不建议将其用于字符串相似性 cos 句子可能会更改,并且您的所有 like 逻辑可能无法获取匹配的记录。建议使用使用朴素贝叶斯文本分类进行相似性为句子分配标签,或者您可以尝试 MSSQL 服务器中的语义搜索功能