簡體   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