InnoDB full-text ignores words shorter than three characters and words appearing in more than half the rows, and both are configurable only at the server level.
SHOW VARIABLES LIKE 'innodb_ft_min_token_size'; -- 3
-- so this matches nothing:
SELECT * FROM products
WHERE MATCH(name) AGAINST('XL' IN NATURAL LANGUAGE MODE);
-- and neither does a term in >50% of rows, in natural
-- language mode. boolean mode has no such threshold:
WHERE MATCH(name) AGAINST('+XL' IN BOOLEAN MODE);
Changing innodb_ft_min_token_size requires a server restart and a rebuild of every full-text index, which makes it a decision rather than a setting. Product catalogues hit both limits immediately — sizes are short and a brand name appears in most rows — which is why boolean mode ends up being what actually ships.