自動補完のための PHP を使用した MySQL でのファジー会社名マッチング
概要
検索会社名のあいまい一致は、オートコンプリート システムの一般的なタスクです。このタスクは、一致する可能性のある企業が多数あり、効率的な検索アルゴリズムが必要であるため、困難になる可能性があります。
Soundex インデックス作成
ファジー マッチングの 1 つのアプローチは、Soundex を使用することです。インデックス作成。 Soundex は、発音に基づいて単語をエンコードする音声アルゴリズムです。これにより、スペルが異なる場合でも、単語をほぼ一致させることができます。ただし、Soundex のインデックス作成には、長い文字列を区別できないことや、最初の文字が同じである必要があることなどの制限があります。
レーベンシュタイン距離
より高度なアプローチファジーマッチングにはレーベンシュタイン距離が使用されます。レーベンシュタイン距離は、ある文字列を別の文字列に変換するために必要な挿入、削除、または置換の数を測定します。 Soundex とは異なり、この方法には前述の欠点がありません。
PHP でのレーベンシュタイン距離の使用
codejanitor.com の Web サイトでは、MySQL ストアド関数の例が提供されています。レーベンシュタイン距離を計算します。この関数を使用すると、次のように会社名に対してあいまい一致を実行できます:
// Load MySQL stored function (if not already loaded) if (!function_exists('Levenshtein')) { $sql = "CREATE FUNCTION Levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT BEGIN DECLARE lv_s1, lv_s2 VARCHAR(255); DECLARE lv_len1, lv_len2, lv_i, lv_j, lv_c, lv_cost INT; DECLARE lv_arr1[255] INT; SET lv_s1 = LOWER(s1); SET lv_s2 = LOWER(s2); SET lv_len1 = LENGTH(lv_s1); SET lv_len2 = LENGTH(lv_s2); -- Initialize the array SET lv_arr1[1] = 0; FOR lv_i = 1 TO lv_len1 DO SET lv_arr1[lv_i + 1] = lv_i; END FOR; -- Step 2 FOR lv_j = 1 TO lv_len2 DO SET lv_c = lv_j; FOR lv_i = 1 TO lv_len1 DO IF SUBSTRING(lv_s1, lv_i, 1) = SUBSTRING(lv_s2, lv_j, 1) THEN SET lv_cost = 0; ELSE SET lv_cost = 1; END IF; SET lv_c = LEAST(lv_c + 1, lv_arr1[lv_i] + lv_cost, lv_arr1[lv_i - 1] + 1); SET lv_arr1[lv_i] = lv_c; END FOR; END FOR; RETURN lv_c; END;"; $result = $mysqli->query($sql); } // Execute fuzzy matching query $numWords = 0; $userInput = "Microsift"; $query = "SELECT company_name, Levenshtein('$userInput', company_name) AS distance FROM companies ORDER BY distance ASC"; $result = $mysqli->query($query); // Display results while ($row = $result->fetch_assoc()) { $numWords++; echo $row['company_name'] . " (" . $row['distance'] . ")\n"; } if ($numWords == 0) { echo "No matches found.\n"; }
以上がオートコンプリートのために PHP を使用して MySQL にあいまいな会社名一致を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。