best practice json(b) Indizierung und (Wildcard)Suche

Hallo,

es geht um die Möglichkeiten von json oder jsonb im Vergleich zu noSQL, z.B. Mongo.

Ich habe eine Tabelle mit ein paar Millionen Datensätzen und einem GIN Index.

CREATE TABLE device_jb (
  jbid serial NOT NULL,
  jbdata jsonb
);
CREATE INDEX idxginjbdata 
       ON device_jb USING gin (jbdata);

Ich habe verstanden, dass ich mit dem @> / <@ Operator diesen Index nutzen kann und sehr schnelle Suche möglich ist, z.B. wenige MS bei Millionen Datensätzen

select jbdata->'configuration' from device_jb 
 where jbdata @> '{"configuration":"d68c28825e2909224785aae367670523"}'

Wie sieht es nun mit Wildcard Suche aus, geht das überhaupt? Gemeint wäre:

select jbdata->'configuration' from device_jb 
 where jbdata LIKE '{"configuration":"d68c28825e%"}'

(Und diese Operatoren funktionieren nur auf Ebene 1 des JSON?)

Sollte man lieber gleich mit TRIGRAM Indizierung arbeiten bzw. was spricht dagegen?

Nein, ein LIKE wird mit dem Index nicht unterstützt. Wenn es immer der gleiche Key im JSON ist, könntest Du einen normalen B-Tree index anlegen:

CREATE INDEX configuration_index on 
       ON device_jb (jbdata ->> 'configuration');

und dann

select jbdata->> 'configuration'
from device_jb 
where jbdata ->> 'configuration' LIKE 'd68c28825e%'

verwenden

Das funktioniert leider nicht. Ich habe noch mit ::json versucht, aber auf einer jsonb geht es so nicht.

mytestdb=# CREATE INDEX configuration_index on
mytestdb-#         device_jb (jbdata ->> 'configuration');
FEHLER:  Syntaxfehler bei »->>«
ZEILE 2:         device_jb (jbdata ->> 'configuration');
                                   ^

Ach, das muss natürlich in Klammern gesetzt werden, und ein ON war auch zuviel

CREATE INDEX configuration_index 
       ON device_jb ( (jbdata ->> 'configuration') );

danke, so funktioniert es.