[英]How do I rank search results by best match in mysql/php?
这适用于MySQL / PHP场景:
假设我需要根据他们的资格找到专业人士。 现在假设搜索输入是“CA,BA”。
LIKE
甚至REGEXP
轻松完成,现在'CA'是准确的匹配所以我希望在他的个人资料中使用CA
的用户排名高于其他用户。 对于第一个,我想我可以使用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.