PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Utiliser la fonction Levenshtein sur chaque élément d'un tsvector ?

Considérez l'extension pg_trgm au lieu de levenshtein() . Il est plus rapide par ordre de grandeur lorsqu'il est soutenu par un index GiST pour prendre en charge le Fonctionnalité KNN dans PostgreSQL 9.1 ou version ultérieure .

Installez l'extension une fois par base de données :

CREATE EXTENSION pg_trgm;

Et utilisez le <-> ou % opérateur . Plusieurs réponses connexes ont été publiées ici sur SO, recherchez pg_tgrm [PostgreSQL] ...

Tir sauvage sur ce que vous voudrez peut-être :

WITH x AS (
    SELECT unnest(string_to_array(trim(strip(
      'fat:2,4 cat:3 rat:5A'::tsvector)::text, ''''), ''' ''')) AS val
    )                                    -- provide ts_vector, extract strings
    , y AS( SELECT 'brat'::text AS term) -- provide term to match
SELECT val, term
      ,(val <-> term) AS trg_dist        -- distance operator
      ,levenshtein(val, term) AS lev_dist
FROM   x, y;

Renvoie :

 val | term | trg_dist | lev_dist
-----+------+----------+----------
 cat | brat |    0.875 |        2
 fat | brat |    0.875 |        2
 rat | brat | 0.714286 |        1