繁体   English   中英

如何通过mysql / php中的最佳匹配对搜索结果进行排名?

[英]How do I rank search results by best match in mysql/php?

这适用于MySQL / PHP场景:

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

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

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

欢迎所有想法

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

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

Levenshtein可能会很慢,但可能

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

编辑

假设您可以重新设计表格

有3张桌子: -

专业人士表名称...

资格表 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM