Sto provando ad usare il tipo "newish" JSONB.Come indicizzare i valori interi di jsonb
Ho una tabella documents
con un campo jsonb properties
e in quello è un campo publication_year
. Voglio trovare tutti i record di documenti entro un intervallo di un anno, ad es. 2013-2015. [MODIFICA: interrogare per un intervallo di valori è la sfida principale qui, anche se ho utilizzato un esempio di corrispondenza esatta di seguito. L'approccio richiesto si applicherebbe anche per, diciamo gamme di dollari (prezzo> $ 20 e il prezzo < $ 40) o intervalli timestamp)]
ho provato:.
create index test1 on documents using gin ((cast(properties->'announced_on_year' as integer)));
ERROR: cannot cast type jsonb to integer
così come:
create index test1 on documents using gin (cast(properties->>'publication_year' as integer));
ERROR: data type integer has no default operator class for access method "gin"
HINT: You must specify an operator class for the index or define a default operator class for the data type.`
Ho visto da questo post http://www.postgresql.org/message-id/[email protected] che questo dovrebbe essere possibile, ma non riesco a capire la sintassi corretta.
Quando ho solo fare un indice semplice:
create index test1 on documents using gin ((properties->'publication_year'));
si crea un indice, ma non posso interrogare utilizzando valori interi per ottenere una gamma che va, si dice
select count(*) from documents where properties->>'publication_year' = 2015;
ERROR: operator does not exist: text = integer
LINE 1: ...*) from documents where properties->>'publication_year' = 2015;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Eventuali suggerimenti e suggerimenti molto apprezzati. Sono sicuro che anche gli altri ne trarranno beneficio. TIA
Grazie. Penso che questa sia la risposta che stavo cercando. Anche se i documenti non lo specificano, con questa soluzione è possibile utilizzare CAST per ottenere i risultati dell'intervallo, come in: 'EXPLAIN ANALYZE SELECT COUNT (*) DA documenti WHERE cast (proprietà - >> 'publication_year' AS integer)> 2012 AND cast (properties - >> 'publication_year' AS integer) <2016; –
Non sono sicuro, se utilizzarlo in questo modo avrà un impatto sulle prestazioni (che credo sia l'obiettivo). Secondo il doc - l'operatore "- >>" non è supportato da questo tipo di indice. Inoltre, puoi combinare 'x> A AND x murison