Le module fuzzystrmatch
fournit diverses fonctions qui
permettent de déterminer les similarités et la distance entre des chaînes.
À 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.
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 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 de la 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)
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)