Ditt första försök är korrekt men du måste använda (partiella) btree-index och bitmappsindexskanningar för att lita på det:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Samma sak för massa, och om planeraren inte får det på plats lägg till två där satser, dvs where ext->'size' is not null
och samma sak för massa.
Om det finns ett mönster av något slag (vilket är troligt, eftersom de flesta produkter med en storlek också har en massa), skapa potentiellt ett flerkolumnindex som kombinerar de två - en påse, den andra beskrivningen.
Ginindexet som du skrev det, tillsammans med den medföljande frågan (med ett syntaxfel) kommer i princip att göra samma sak men oordnat; det kommer att gå långsammare.