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

Comment puis-je interroger SQL pour des mots avec ponctuation dans Postgresql?

tsvecteur

Utilisez le tsvector type, qui fait partie de la fonctionnalité de recherche de texte de PostgreSQL.

postgres> select 'What are Q-type Operations?'::tsvector;
              tsvector               
-------------------------------------
 'Operations?' 'Q-type' 'What' 'are'
(1 row)

Vous pouvez également utiliser des opérateurs familiers sur les tsvectors :

postgres> select 'What are Q-type Operations?'::tsvector
postgres>        || 'A.B.C''s of Coding'::tsvector;
                           ?column?                           
--------------------------------------------------------------
 'A.B.C''s' 'Coding' 'Operations?' 'Q-type' 'What' 'are' 'of'

De la documentation de tsvector :

Si vous souhaitez également effectuer une normalisation spécifique à la langue, comme supprimer des mots courants ('le', 'a', etc.) et multiplier, utilisez le to_tsvector fonction. Il attribue également des pondérations à différents mots pour la recherche de texte :

postgres> select to_tsvector('english',
postgres> 'What are Q-type Operations? A.B.C''s of Coding');
                      to_tsvector                       
--------------------------------------------------------
 'a.b.c':7 'code':10 'oper':6 'q':4 'q-type':3 'type':5
(1 row)

Recherche textuelle complète

Évidemment, faire cela pour chaque ligne d'une requête coûtera cher - vous devez donc stocker le tsvector dans une colonne séparée et utiliser ts_query() pour le rechercher. Cela vous permet également de créer un index GiST sur le tsvector.

postgres> insert into text (phrase, tsvec)
postgres>   values('What are Q-type Operations?',
postgres>   to_tsvector('english', 'What are Q-type Operations?'));
INSERT 0 1

La recherche se fait à l'aide de tsquery et de l'opérateur @@ :

postgres> select phrase from text where tsvec @@ to_tsquery('q-type');
           phrase            
-----------------------------
 What are Q-type Operations?
(1 row)