PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie frage ich SQL nach Wörtern mit Satzzeichen in Postgresql ab?

tsvektor

Verwenden Sie den tsvector Typ, der Teil der Textsuchfunktion von PostgreSQL ist.

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

Sie können auch bekannte Operatoren für tsvectors verwenden:

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'

Aus der tsvector-Dokumentation:

Wenn Sie auch eine sprachspezifische Normalisierung durchführen möchten, wie das Entfernen gemeinsamer Wörter ('the', 'a' usw.) und Multiplikationen, verwenden Sie den to_tsvector Funktion. Es weist auch verschiedenen Wörtern für die Textsuche Gewichtungen zu:

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)

Vollständige Textsuche

Offensichtlich ist es teuer, dies für jede Zeile in einer Abfrage zu tun – daher sollten Sie den tsvector in einer separaten Spalte speichern und ts_query() verwenden, um danach zu suchen. Auf diese Weise können Sie auch einen GiST-Index für den tsvector erstellen.

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

Die Suche erfolgt mit tsquery und dem Operator @@:

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