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

Funktioniert der Ausdruckssuchoperator <-> mit JSONB-Dokumenten oder nur mit relationalen Tabellen?

Die Phrasensuchfunktion ist in die Textsuchdaten integriert eingeben tsquery . Der Textsuchoperator @@ Sie zeigen einen tsvector an links und ein tsquery Nach rechts. Und ein tsvector kann aus jedem Zeichentyp sowie aus einem JSON-Dokument erstellt werden.

Verwandte:

Sie können Ihren json konvertieren oder jsonb document zu einem Textsuchvektor mit einem der dediziert Funktionen :

to_tsvector()
json(b)_to_tsvector()

Beachten Sie, dass diese nur Werte enthalten aus dem JSON-Dokument, nicht Schlüssel . Normalerweise ist das das, was Sie wollen. Einfaches Beispiel:

SELECT to_tsvector(jsonb '{"foo":"jump quickly"}')
    @@ to_tsquery('jump <-> quick:*');

Demonstration des Präfixabgleichs zusätzlich zur Phrasensuche, während Sie gerade dabei sind. Siehe:

Alternativ , können Sie einfach den tsvector erstellen aus dem text Darstellung Ihres JSON-Dokuments, um auch Schlüsselnamen einzuschließen:

SELECT to_tsvector((jsonb '{"foo-fighter":"jump quickly"}')::text)
    @@ to_tsquery('foo <-> fight:*');

Erzeugt einen größeren tsvector , offensichtlich.

Beide können indiziert werden (was der Hauptpunkt der Textsuche ist). Nur Indizes sind an relationale Tabellen gebunden. (Und Sie können den Ausdruck indizieren !)
Der Ausdruck selbst kann auf jeden Wert angewendet werden, nicht an Tabellen gebunden, wie Sie scheinen zu implizieren.