Documentation PostgreSQL 14.22 » Annexes » Modules supplémentaires fournis » fuzzystrmatch

Précédent | Niveau supérieur | Suivant
F.14. file_fdw | Sommaire | F.16. hstore

## F.15. fuzzystrmatch

Le module `fuzzystrmatch` fournit diverses fonctions qui permettent de déterminer les similarités et la distance entre des chaînes.

### Attention

À présent, les `soundex`, `metaphone`, `dmetaphone` et `dmetaphone_alt` ne fonctionnent pas correctement avec les encodages multi-octets (comme l'UTF-8).

Ce module est considéré comme « trusted », ce qui signifie qu'il peut être installé par des utilisateurs simples (sans attribut `SUPERUSER`) et qui ont l'attribut `CREATE` sur la base de données courante.

### F.15.1. Soundex

Le système Soundex est une méthode qui permet d'associer des noms (ou des mots) dont la prononciation est proche en les convertissant dans le même code. Elle a été utilisée à l'origine par le « United States Census » en 1880, 1900 et 1910. Soundex n'est pas très utile pour les noms qui ne sont pas anglais.

Le module `fuzzystrmatch` fournit deux fonctions pour travailler avec des codes Soundex :

       soundex(text) returns text
       difference(text, text) returns int

La fonction `soundex` convertit une chaîne en son code Soundex. La fonction `difference` convertit deux chaînes en leurs codes Soundex, puis rapporte le nombre de positions de code correspondant. Comme les codes Soundex ont quatre caractères, le résultat va de zéro à quatre. Zéro correspond à aucune correspondance, quatre à une correspondance exacte. (Du coup, la fonction est mal nommée -- `similarity` aurait été un meilleur nom.)

Voici quelques exemples d'utilisation :

    SELECT soundex('hello world!');

    SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
    SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
    SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');

    CREATE TABLE s (nm text);

    INSERT INTO s VALUES ('john');
    INSERT INTO s VALUES ('joan');
    INSERT INTO s VALUES ('wobbly');
    INSERT INTO s VALUES ('jack');

    SELECT * FROM s WHERE soundex(nm) = soundex('john');

    SELECT * FROM s WHERE difference(s.nm, 'john') > 2;

### F.15.2. Levenshtein

Cette fonction calcule la distance de Levenshtein entre deux chaînes :

       levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) returns int
       levenshtein(text source, text target) returns int
       levenshtein_less_equal(text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d) returns int
       levenshtein_less_equal(text source, text target, int max_d) returns int

La `source` et la cible (`target`) sont des chaînes quelconques non NULL de 255 caractères. Les paramètres de coût indiquent respectivement le coût d'une insertion, suppression ou substitution d'un paramètre. Vous pouvez omettre les paramètres de coût, comme dans la deuxième version. Dans ce cas, elles ont 1 comme valeur par défaut.

`levenshtein_less_equal` est une version accélérée de la fonction Levenshtein à utiliser que lorsque de petites distances sont intéressantes. Si la distance réelle est inférieure ou égale à `max_d`, alors `levenshtein_less_equal` renvoie la bonne distance ; sinon elle renvoie une valeur supérieure à `max_d`. Si `max_d` est négatif, alors le comportement est identique à `levenshtein`.

Exemples :

    test=# SELECT levenshtein('GUMBO', 'GAMBOL');
     levenshtein
    -------------
               2
    (1 row)

    test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1);
     levenshtein
    -------------
               3
    (1 row)

    test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2);
     levenshtein_less_equal
    ------------------------
                          3
    (1 row)

    test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4);
     levenshtein_less_equal
    ------------------------
                          4
    (1 row)

### F.15.3. Metaphone

Metaphone, comme Soundex, construit un code représentatif de la chaîne en entrée. Deux chaînes sont considérées similaires si elles ont le même code.

Cette fonction calcule le code metaphone d'une chaîne en entrée :

       metaphone(text source, int max_output_length) returns text

`source` doit être une chaîne non NULL de 255 caractères au maximum. `max_output_length` fixe la longueur maximale du code metaphone résultant ; s'il est plus long, la sortie est tronquée à cette taille.

Exemple

    test=# SELECT metaphone('GUMBO', 4);
     metaphone
    -----------
     KM
    (1 row)

### F.15.4. Double Metaphone

Le système « Double Metaphone » calcule deux chaînes « qui se ressemblent » pour une chaîne en entrée -- une « primaire » et une « alternative ». Dans la plupart des cas, elles sont identiques mais, tout spécialement pour les noms autres qu'anglais, elles peuvent être légèrement différentes, selon la prononciation. Ces fonctions calculent le code primaire et le code alternatif :

       dmetaphone(text source) returns text
       dmetaphone_alt(text source) returns text

Il n'y a pas de limite de longueur sur les chaînes en entrée.

Exemple :

    test=# select dmetaphone('gumbo');
     dmetaphone
    ------------
     KMP
    (1 row)