3

这适用于 MySQL/PHP 场景:

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

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

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

欢迎所有想法

4

2 回答 2

0

Levenshtein 可能会很慢,但可能

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

编辑

假设您可以重新设计表格

有 3 张桌子:-

专业人士 ID 姓名表...

资格表 Id QualificationName

LinkTable ProfessionalId QualificationId

然后做一个查询,为资格的 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
于 2013-07-17T11:13:10.823 回答
0

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

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

于 2013-07-17T11:03:41.137 回答