Отвечу сам на свой вопрос.
Если хочется хранить массив названий в одном поле, то к "name" полю можно добавить
"index_options": "docs"
, и количество вхождений слова перестанет влиять на релевантность.
Так же можно добавить
"norms": { "enabled": false }
и общая длина строки перестанет влиять на релевантность.
Но всё это костыли, которые не помогут для более сложных случаев, когда затем вам захочется сделать разные хитрые комбинации повышения/понижения релевантности для разных ситуаций.
Например, с массивом названий не выйдет сделать буст релевантности при полном совпадении одного из названий с искомой фразой.
Поэтому единственным подходящим вариантом вижу построение индекса таким образом, чтобы одно название товара "мапилось" на одну строку в индексе эластика.
Для понимания того, как считается релевантность очень помогла статья
Theory Behind Relevance Scoring.
Так же для себя обнаружил, что на релевантность влияет, насколько часто встречается слово во всём индексе
https://www.elastic.co/guide/en/elasticsearch/guid... И влияет оно порой очень сильно. Поэтому при реализации поиска по названиям idf фактор ранжирования стоит в обязательном порядке отключать
https://stackoverflow.com/questions/33208587/elast... (работает в версии эластика начиная с 6.2)