Votre tentative initiale est correcte, mais vous devez utiliser des index btree (partiels) et des analyses d'index bitmap pour vous y fier :
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Idem pour la masse, et si le planificateur ne l'obtient pas sur place, ajoutez deux clauses where, c'est-à-dire where ext->'size' is not null
et pareil pour la masse.
S'il existe un modèle quelconque (ce qui est probable, puisque la plupart des produits avec une taille ont également une masse), créez potentiellement un index multicolonne combinant les deux - un sac, l'autre desc.
L'index gin tel que vous l'avez écrit, ainsi que la requête qui l'accompagne (avec une erreur de syntaxe) feront essentiellement la même chose mais sans ordre; ce sera plus lent.