【问题标题】:How do I rank search results by best match in mysql/php?如何通过 mysql/php 中的最佳匹配对搜索结果进行排名?
【发布时间】:2013-07-17 19:40:43
【问题描述】:

这是针对 MySQL/PHP 场景的:

假设我需要根据他们的资格寻找专业人士。现在假设搜索输入是“CA,BA”。

  1. 我希望它匹配 'CA','MCA','BCA','MBA',... 如果我忽略性能,可以通过在 MySQL 中使用 LIKE 甚至 REGEXP 轻松完成,现在 'CA' 是完全匹配的,所以我希望个人资料中包含 CA 的用户排名高于其他用户。
  2. 由于我正在搜索两个条目,因此我希望根据此人是否匹配(或部分匹配)两个资格而不是单个资格对结果列表进行进一步排序。

对于第一个,我想我可以使用 levenshtein 距离,但我担心性能。但对于第二个,我完全不知道。所以我的问题是如何以最高效的方式做到这一点?

欢迎所有想法

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    Levenshtein 可能会很慢,但可能

    对每个要检查的值进行一次查询,得到 MIN lenvenshtein 距离。对 2 个查询执行 UNION ALL,并将其用作子查询以选择人员和最小距离的总和,并按该值降序排列。

    编辑

    假设您可以重新设计表格

    有 3 个表:-

    专业人士表 ID 姓名 ...

    资格表 ID 资格名称

    链接表 专业ID 资质标识

    然后做一个查询,为资格的 levenshtein 距离做一个子选择(这应该意味着只根据资格而不是每个人的资格):-

    SELECT Name, SUM(Relevancy) AS SumRelevancy
    FROM
    (
        SELECT a.Name, MIN(c.Relevancy) AS Relevancy 
        FROM Professionals a
        INNER JOIN LinkTable b ON a.Id = b.ProfessionalId
        INNER JOIN
        (
            SELECT QualificationId, LEVENSHTEIN('CA', QualificationName) AS Relevancy FROM Qualifications
        ) c ON b.QualificationId = c.QualificationId
        GROUP BY a.Name
        UNION ALL
        SELECT a.Name, MIN(c.Relevancy) AS Relevancy 
        FROM Professionals a
        INNER JOIN LinkTable b ON a.Id = b.ProfessionalId
        INNER JOIN
        (
            SELECT QualificationId, LEVENSHTEIN('BA', QualificationName) AS Relevancy FROM Qualifications
        ) c ON b.QualificationId = c.QualificationId
        GROUP BY a.Name
    ) Sub1
    GROUP BY Name
    ORDER BY SumRelevancy
    

    【讨论】:

    • 会起作用,但即使我将这个逻辑转换为存储过程,考虑到要查看几千个用户的数据库,我相信它会非常慢。也许我可以事先将值的 soundex 存储在参考表中……但我仍然认为,如果我让 mysql 自己完成这整个事情,它会很慢吗?有没有什么办法可以把php和mysql结合起来,让事情更加优化?
    • 这样的事情会很慢。 Levenshtein 并没有那么快,因为它需要比较值,所以你不能真正提前计算它。 Soundex 将毫无用处,因为第一个字符必须匹配,而且它是为欧洲名称设计的,不适用于一般单词和非欧洲名称。你能改变数据库设计吗?
    • 编辑建议解决方案,如果您可以重新设计表格
    【解决方案2】:

    我会搜索 Exact 匹配项,将它们放入数组中,然后搜索 Like 匹配项并将它们放入数组中。

    最后我会做一个array_diff,结果就在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 2021-12-09
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2011-10-16
      相关资源
      最近更新 更多