3

これは、MySQL/PHP シナリオ用です。

資格に基づいて専門家を見つける必要があるとしましょう。ここで、検索入力が「CA,BA」であるとします。

  1. 「CA」、「MCA」、「BCA」、「MBA」などと一致させたい...パフォーマンスを無視すれば、MySQL を使用してLIKE、または MySQL でも簡単に実行できますREGEXP。現在、「CA」が完全に一致しているため、CAプロフィールにあるユーザーを他のユーザーよりも上位にランク付けしたい。
  2. 2 つのエントリを検索しているので、その人物が 1 つの資格ではなく両方の資格に一致する (または部分的に一致する) かどうかに基づいて、結果のリストをさらに並べ替えたいと考えています。

最初のものは、レーベンシュタイン距離を使用できると思いますが、パフォーマンスが心配です。しかし、2つ目については、まったくわかりません。だから私の質問は、これを最もパフォーマンス効率の良い方法で行う方法ですか?

すべてのアイデアを歓迎します

4

2 に答える 2

0

Exact マッチを検索して配列にスローし、Like マッチを検索して配列にスローします。

最後に、array_diff を実行すると、結果が表示されます。

于 2013-07-17T11:03:41.137 に答える
0

レーベンシュタインはおそらく遅いですが、可能です

チェックする値ごとに 1 つのクエリを実行し、MIN lenvenshtein 距離を取得します。2 つのクエリの UNION ALL を実行し、それをサブクエリとして使用して人物と最小距離の合計を選択し、その値で降順に並べ替えます。

編集

テーブルを再設計できると仮定すると

3つのテーブルがあります:-

専門家 ID名の表...

資格の表 Id QualificationName

LinkTable ProfessionalId QualificationId

次に、資格のレーベンシュタイン距離のサブセレクトを行うクエリを実行します (これは、個人の資格ごとではなく、資格ごとにのみ実行することを意味する必要があります):-

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 に答える