Maison >base de données >tutoriel mysql >Comment puis-je implémenter une correspondance floue de nom d'entreprise dans MySQL avec PHP pour la saisie semi-automatique ?

Comment puis-je implémenter une correspondance floue de nom d'entreprise dans MySQL avec PHP pour la saisie semi-automatique ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-14 16:52:11194parcourir

How can I implement fuzzy company name matching in MySQL with PHP for auto-completion?

Correspondance floue du nom de l'entreprise dans MySQL avec PHP pour la saisie semi-automatique

Introduction

Recherche Les correspondances floues pour les noms d’entreprises sont une tâche courante dans les systèmes de saisie semi-automatique. Cette tâche peut être difficile en raison du grand nombre d'entreprises potentiellement correspondantes et de la nécessité d'algorithmes de recherche efficaces.

Indexation Soundex

Une approche de la correspondance floue consiste à utiliser Soundex indexage. Soundex est un algorithme phonétique qui code les mots en fonction de leur prononciation. Cela permet une correspondance approximative des mots, même s'ils ont des orthographes différentes. Cependant, l'indexation Soundex présente des limites, comme l'impossibilité de différencier les chaînes plus longues et l'exigence que la première lettre soit la même.

Distance de Levenshtein

Une approche plus avancée à la correspondance floue consiste à utiliser la distance de Levenshtein. La distance de Levenshtein mesure le nombre d'insertions, de suppressions ou de substitutions nécessaires pour transformer une chaîne en une autre. Contrairement à Soundex, cette méthode ne présente pas les inconvénients mentionnés précédemment.

Utilisation de Levenshtein Distance en PHP

Le site Web codejanitor.com fournit un exemple de fonction stockée MySQL qui calcule la distance de Levenshtein. Vous pouvez utiliser cette fonction pour effectuer une correspondance floue sur les noms de sociétés comme suit :

// 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";
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn