Váš počáteční pokus je správný, ale musíte použít (částečné) indexy btree a skenování indexů bitmap, abyste se na něj mohli spolehnout:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Totéž pro hmotnost, a pokud to plánovač nezjistí na místě, přidejte dvě klauzule where, tj. where ext->'size' is not null
a totéž pro hmotnost.
Pokud existuje nějaký vzor (což je pravděpodobné, protože většina produktů s velikostí má také hmotnost), potenciálně vytvořte vícesloupcový index spojující dva - jeden vak, druhý popis.
Index gin tak, jak jste jej napsali, spolu s doprovodným dotazem (s chybou syntaxe) budou v podstatě dělat totéž, ale neuspořádané; bude to pomalejší.