Le module fuzzystrmatch fournit diverses fonctions qui permettent de déterminer les similarités et la distance entre des chaînes.
Actuellement, fuzzystrmatch ne fonctionne pas bien avec les encodages multi-octets (comme l'UTF-8).
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 leur 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;
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
La source et la cible (target) sont des chaînes quelconques non NULL de 255 bytes. 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 de la version. Dans ce cas, elles ont 1 comme valeur par défaut.
Exemples :
test=# SELECT levenshtein('GUMBO', 'GAMBOL'); levenshtein ------------- 2 (1 row) test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1); levenshtein ------------- 3 (1 row)
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)
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)