Il tuo tentativo iniziale è corretto, ma devi utilizzare gli indici btree (parziali) e le scansioni degli indici bitmap per fare affidamento su di esso:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Lo stesso per la massa, e se il pianificatore non lo ottiene sul posto aggiungi due clausole where, cioè where ext->'size' is not null
e lo stesso per la messa.
Se è presente uno schema di qualche tipo (che è probabile, dal momento che la maggior parte dei prodotti con una dimensione ha anche una massa), crea potenzialmente un indice multicolonna combinando i due:uno sac, l'altro desc.
L'indice gin come l'hai scritto, insieme alla query di accompagnamento (con un errore di sintassi) farà sostanzialmente la stessa cosa ma non ordinato; sarà più lento.