可以在阿拉伯语中找到Typos的SQL查询

时间:2016-01-09 07:05:21

标签: mysql sql performance word letter

我想制作一本字典,我需要有一个查询,可以找到拼写错误的单词(我的意思是拼写错误或拼写错误或拼写错误),如果查询找不到确切的单词,那么请尝试使用其他拼写。

那么什么是阿拉伯语: 在阿拉伯语中有一些字母带有(几乎)相同的发音但字母不同,人们有时不会知道应该使用哪一个。例如阿拉伯语中有4种Z “Ò/ظ/ذ/ض”发音不同(一点点)但是人们会忘记哪一个是正确的拼写。使用“z”字母的一个单词的示例:

  

مریز/مریض/مریظ/مریذ

     

正确的是مریض

以下是其他拥有多个后者的世界:

z: ض / ز / ذ / ظ 

T: ت / ط / 

S: ث / س / ص / 

Gh: ق / غ

那么你的想法是什么? 应该如何查询?

我想如果用户搜索“مریز”而不是向他显示404错误(未找到),则用其他字母(全部为Z)搜索数据库,然后如果找到任何内容则返回结果。

3 个答案:

答案 0 :(得分:5)

在德语中,我们在t和tt或dt方面存在同样的问题 - 特别是在名称中。

解决此问题的一种方法是存储包含具有固定转换的名称/单词的附加规范化列。

 tt -> t
 dt -> t
 ß  -> s
 ss -> s

所以表格包含

 WORD    | NORMALIZED
 schmitt | schmit
 schmidt | schmit

在查询时,将这些相同的转换应用于查询,然后与规范化列进行比较。

答案 1 :(得分:4)

有一种名为Levenshtein distance的算法(还有其他算法),它告诉两个字符串之间的编辑距离。

您可以从中得出,尝试在您的词典中找到与您的输入相比最相似的单词。

稍后您可以根据您提到的字母元组为替换分配权重以优化搜索。

实际上有一个MySQL的实现,你一定要查看:https://www.artfulsoftware.com/infotree/qrytip.php?id=552
SO中的大多数levenshtein + mysql问题都指向此页面。

答案 2 :(得分:2)

更简单的解决方案是在类似语句中使用正则表达式。 对于可能拼写错误的字母,您可以将变量保存在正则表达式通配符中。 对应于z通配符的字母是“[Òذظض]” 您可以使用通配符替换所有Ò,ذ,ظ,ض字母,然后使用类似的语句进行查询:

select * from searched_table where word like "%[مرى[زذظض%"

找到所搜索单词的所有版本后,您可以向用户显示所有这些单词,也可以计算出levenshtein距离(koshinae的答案)并显示最接近的单词。

编辑:仅针对字母Z,查询将如下所示

set @word = 'مرىض'; -- take this text from user
set @word = replace(@word, 'ذ', 'Z');
set @word = replace(@word, 'ظ', 'Z');
set @word = replace(@word, 'ض', 'Z');
set @word = replace(@word, 'ز', 'Z');
set @word = replace(@word, 'Z', '[زظضذ]');
set @word = Concat('%',  @word,  '%');
select @word;

select * from mydb.searchTable where word like @word;