如何搜索具有误差幅度的特定string
?
示例:
我有table
个value
s:
品牌表
- 品牌:松下,型号:15T
- 品牌:Apple,型号:IPHONE 7
- 品牌:三星,型号:Galaxy S8
- 品牌:Microsoft,M15
我想找到3个错误字符边缘的巧合。
对于示例,我的输入是M $ crosoft,我希望它返回Microsoft row
。或者,如果我输入Pnasonic,则应输入Panasonic row
。
如何在不牺牲性能的情况下实现这一目标?
简单的方法是比较每个角色和3个错误的计数器,但我需要表现,因为品牌table
大约有200K + row
s。
P.S我用PHP编码。
答案 0 :(得分:0)
你可能想要使用Metaphone和Levenshtein的组合。 (用于拼写错误)
http://php.net/manual/en/function.metaphone.php
并且
http://php.net/manual/en/function.levenshtein.php
Metaphone可以处理声音,因为它很糟糕"例如,您可以将其视为删除元音并将一些复合声音更改为单个字母(几乎就像速记一样)。所以使用你的例子
$sound1 = metaphone('M$crosoft');
echo "$sound1\n";
$sound2 = metaphone('Microsoft');
echo "$sound2\n";
输出
MKRSFT
MKRSFT
你可以看到它们相符。
你可以在这里测试一下
http://sandbox.onlinephpfunctions.com/code/716471f5fed18268a2dc0aea800b3db634d9616f
性能由于运行metaphone的额外开销,我建议预先计算您手动搜索的单词的声音索引,并将其保存在数据库中。然后,当您运行用户搜索时,在其搜索词上运行相同的metaphone
函数,并使用该函数搜索表中的声音索引。通过这种方式,您可以预先加载构建声音索引的成本,并且只需要执行一次(或者在编辑记录时)
但是,您可能会发现匹配太松,在这种情况下您可以使用Levenshtein。这将根据所需的更改计算2个单词之间的差异。例如插入需要进行的更新和删除操作,甚至可以对操作进行加权。
$len = levenshtein ('M$crosoft', 'Microsoft');
echo "$len\n";
//as you can see the arguments are $str1, $str2, insert cost, replace cost, delete cost
//so we can control what weight we get for each operation.
$len = levenshtein ('M$crosoft', 'Microsoft', 1,2,1);
echo "$len\n";
OUPUTS
1
2
现在,如果您需要将其与" Bunch"可能会变得非常复杂的文本,因为您必须在数据库上使用全文搜索。
这不是微不足道的。
可能更好的选择是使用像Sphinx这样的全文搜索引擎。让它像基本设置一样不难。但它不会成为一个神奇的子弹,所以你必须做一些事情,如词干和字形等。
再次不是微不足道,但它确实有更好的全文搜索,然后是Mysql DB,
性能我可以告诉你它快速,可能比文本搜索的MySql快20倍,但它带来了它自己的怪癖。但我强烈推荐它。我们通过我们的小型狮身人面像集群每分钟运行大约150,000次搜索,记录集为1/4百万行。 (我们的主服务器是12核,54GB怪物)
这种类型的搜索没有一个确定的解决方案,或者至少我还没有找到它(我已经做了很多)。