Su intento inicial es correcto, pero necesita usar índices btree (parciales) y escaneos de índices de mapas de bits para confiar en él:
create index on product(((ext->'size')::int)) where ((ext->'size') is not null);
Lo mismo para la masa, y si el planificador no lo entiende en el momento, agregue dos cláusulas where, es decir, where ext->'size' is not null
y lo mismo para la masa.
Si hay un patrón de algún tipo (lo cual es probable, ya que la mayoría de los productos con un tamaño también tienen una masa), cree potencialmente un índice de varias columnas que combine los dos:un saco, el otro desc.
El índice de gin tal como lo escribió, junto con la consulta que lo acompaña (con un error de sintaxis) básicamente hará lo mismo pero desordenado; será más lento.