Dit første forsøg er korrekt, men du skal bruge (delvise) btree-indekser og bitmap-indeksscanninger for at stole på det:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Det samme for masse, og hvis planlæggeren ikke får det på stedet, tilføj to hvor klausuler, dvs. where ext->'size' is not null
og det samme for masse.
Hvis der er et mønster af en eller anden art (hvilket er sandsynligt, da de fleste produkter med en størrelse også har en masse), kan du potentielt oprette et indeks med flere kolonner, der kombinerer de to - en sæk, den anden beskrivelse.
Gin-indekset, som du skrev det, sammen med den medfølgende forespørgsel (med en syntaksfejl) vil grundlæggende gøre det samme, men uordnet; det bliver langsommere.