搜索具有错误边距的特定字符串

时间:2017-11-10 01:55:15

标签: php string find margin

如何搜索具有误差幅度的特定string

示例:

我有tablevalue 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编码。

1 个答案:

答案 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,

http://sphinxsearch.com/

性能我可以告诉你它快速,可能比文本搜索的MySql快20倍,但它带来了它自己的怪癖。但我强烈推荐它。我们通过我们的小型狮身人面像集群每分钟运行大约150,000次搜索,记录集为1/4百万行。 (我们的主服务器是12核,54GB怪物)

这种类型的搜索没有一个确定的解决方案,或者至少我还没有找到它(我已经做了很多)。