【问题标题】:fuzzy searching an array in php在php中模糊搜索数组
【发布时间】:2011-08-01 10:03:24
【问题描述】:

我搜索后发现如何对 字符串 进行模糊搜索

但我有一个字符串数组

$search = {"a" => "laptop","b" => "screen" ....}

我从数据库 MySQL 中检索到的

是否有任何 php 类或函数对单词数组进行模糊搜索

或者至少是一些有用信息的链接

我看到推荐使用 PostgreSQL 的评论

它具有模糊搜索能力,但是

公司已经有一个 MySQL 数据库

有什么推荐的吗??

【问题讨论】:

    标签: php fuzzy-search


    【解决方案1】:

    可以在 MySQL 中执行此操作,因为您已经有一个 MySQL 数据库 - How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete? 提到了 MySQL Double Metaphone implementation 并在 SQL for MySQL 5.0+ 中有一个 implementation

    编辑:很抱歉在这里回答,因为评论中无法容纳更多内容......

    既然您已经接受了使用PHP Levenshtein function 的答案,那么我建议您先尝试该方法。软件是迭代的; PHP 数组搜索可能正是您想要的,但您必须先根据您的要求对其进行测试和实现。正如我在your other question 中所说,在键入时查找 解决方案可能是这里最简单的解决方案,它只是在用户键入时缩小产品范围。可能不需要实现任何 模糊 搜索,因为您使用 User 自己进行模糊搜索:-)

    例如,用户开始输入Sam,这允许您将产品缩小到以Sam 开头的产品。所以你总是只让用户选择你已经知道是有效的产品。

    【讨论】:

    • 那些是真实的人名,但我正在寻找像“Samsung”“Nokia”“laptop”“pentuim 4”“ATI radion”之类的名字,我看过双元电话,听起来如果我用它来匹配这样的名字会产生问题
    • 您能否将链接添加到描述这些限制的文章中?
    • 我没有提到这些是限制,但我认为它们对我来说不会很好,我害怕测试可能会让我更痛苦的东西
    • 编辑了我的答案,因为它不适合评论。
    【解决方案2】:

    Levenshtein function

    基本上,它为您提供了字符串之间的差异(在成本方面)。 IE。将字符串 A 转换为字符串 B 的成本是多少?

    为自己设置一个阈值 levenshein 距离,任何低于该值的两个词都表示它们相似。

    另外,Bitap algorithm 更快,因为它可以通过位运算符实现,但我相信你必须自己实现它,除非某处有 PHP 库。

    编辑 使用 levenshtein 方法:

    搜索字符串是“maptop”,您将“成本阈值”设置为 2。这意味着您希望任何与搜索字符串相差两个字符串转换操作的单词。

    所以你遍历你的字符串数组“A”直到

    levenshtein ( A[i] , searchString ) <= 2

    那将是你的对手。 但是您可能会得到多个匹配的单词,因此您可以自行决定如何处理额外的结果。

    【讨论】:

    • 换句话说,我应该开始自己写它,因为它不存在一个简单的方法?
    • 关于数据库是PostgreSQL真的比MySQL更好地处理模糊搜索吗?
    • 我需要一个建议,因为如果这是真的,我不应该浪费时间将搜索应用到 PHP 数组,而数据库应该处理它
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2019-08-04
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多