Maison >base de données >tutoriel mysql >Comment le module pg_trgm de PostgreSQL peut-il trouver efficacement des chaînes similaires dans de grands ensembles de données ?

Comment le module pg_trgm de PostgreSQL peut-il trouver efficacement des chaînes similaires dans de grands ensembles de données ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-05 12:29:40536parcourir

How Can PostgreSQL's pg_trgm Module Efficiently Find Similar Strings in Large Datasets?

Recherche rapide de chaînes similaires avec PostgreSQL

L'une des exigences courantes en matière de récupération de texte est de trouver des chaînes similaires à une chaîne d'entrée donnée. . PostgreSQL fournit le module pg_trgm à cet effet. Cependant, lorsqu'il s'agit de grands ensembles de données, l'approche par force brute consistant à calculer les scores de similarité pour chaque paire de chaînes peut devenir inefficace.

L'approche conventionnelle consiste à créer un index GiST sur la colonne de nom en utilisant gist_trgm_ops comme opérateur d'index. . Le problème avec cette approche est qu'elle nécessite de calculer des scores de similarité pour chaque paire d'éléments, ce qui entraîne une complexité temporelle quadratique.

Une solution plus efficace consiste à utiliser l'opérateur % fourni par pg_trgm . En définissant le paramètre pg_trgm.similarity_threshold sur une valeur prédéfinie (par exemple, 0,8), l'optimiseur peut utiliser l'index du trigramme GiST pour filtrer les paires candidates qui sont inférieures au seuil de similarité spécifié. Cela réduit considérablement le nombre de calculs de similarité requis et améliore les performances des requêtes.

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 requête optimisée utilise l'opérateur % pour pré-filtrer les paires candidates avant de calculer les scores de similarité, améliorant ainsi considérablement les performances des requêtes.

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