[英]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.