Recherche efficace de chaînes similaires dans PostgreSQL
Intro : La recherche de chaînes similaires dans de grands ensembles de données peut rencontrer des problèmes de performances lors de l'utilisation méthodes conventionnelles. Cet article présente une solution qui accélère considérablement le processus de recherche en utilisant le module pg_trgm de PostgreSQL.
Utilisation de SET pg_trgm.similarity_threshold et de l'opérateur % :
La requête que vous avez fournie souffre de calculs de similarité excessifs. Pour améliorer l'efficacité, utilisez le paramètre de configuration SET pg_trgm.similarity_threshold et l'opérateur % :
SET pg_trgm.similarity_threshold = 0.8; SELECT similarity(n1.name, n2.name) AS sim, n1.name, n2.name FROM names n1 JOIN names n2 ON n1.name <> n2.name AND n1.name % n2.name ORDER BY sim DESC;
Cette approche exploite un index trigramme GiST, accélérant considérablement la recherche.
Utilisation de Functional Index :
Pour améliorer davantage les performances, envisagez d'utiliser des index fonctionnels pour préfiltrer les correspondances possibles avant la jointure croisée. Cela réduit le nombre de calculs de similarité requis, comme le démontre la requête suivante :
CREATE FUNCTION first_char(text) RETURNS text AS $$ SELECT substring(, 1, 1); $$ LANGUAGE SQL; CREATE INDEX first_char_idx ON names (first_char(name));
SELECT similarity(n1.name, n2.name) AS sim, n1.name, n2.name FROM names n1 JOIN names n2 ON first_char(n1.name) = first_char(n2.name) AND n1.name <> n2.name ORDER BY sim DESC;
Conclusion :
En employant le module pg_trgm, SET pg_trgm .similarity_threshold, l'opérateur % et les index fonctionnels, vous pouvez considérablement améliorer les performances de recherche de chaînes similaires dans PostgreSQL, même pour les grands ensembles de données.
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!