Вам необходимо использовать тип данных json из mysql. Парадигма здесь состоит в том, чтобы сжать все эти прекрасные данные перед фактическим процессом индексации. Вы запускаете хранимую процедуру, которая обрабатывает данные и хранит их в одной большой плоской таблице. Все ваши отношения хранятся в виде объектов json в поле json (если, конечно, это имеет смысл). Затем вы индексируете эти отношения как вложенные типы данных в эластичном поиске. затем вы можете объединиться для получения желаемых результатов. Работает как шарм!
Например:
INSERT prod.id,
...,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('color', color, 'size', size)) FROM tag_products where prod.id = tprod.product_id) AS tag_product_as_json,
INTO Elastic_Products FROM Products AS prod
LEFT JOIN tag_product AS tprod ON prod.id = tprod.product_id
...
Я больше похож на SQL-сервера, так что простите, если вы обнаружите какую-либо ошибку в синтаксисе. Tag_product_as_json будет иметь тип данных json и будет содержать все строки с одинаковым product_id. Вы можете хранить там много строк.
Этот пример очень простой. Вы могли бы достичь аналогичных результатов более эффективным способом использования памяти, используя обычные табличные выражения, но это более сложно и выходит за рамки темы.