Мне нужно иметь возможность собирать данные на лету на основе нескольких значений в поле в индексе.
Например - если мой индекс содержал тип ключевого слова моделей автомобилей (известный конечный список) ицену автомобиля, я хотел бы агрегировать на основе типа автомобиля, чтобы получить количество автомобилей для модели и сумму цен.Я знаю, что лучше всего сохранить информацию о модели автомобиля в самом индексе, но на данный момент это не вариант.
Я хотел бы иметь следующую группировку:
minivan
odyssey, sienna, caravan
sedan
corolla, accord, regal
suv
rav4, rogue, crv
other
pinto
и вывести результат, например:
minivan - num 2,010, price 80,000,000
sedan - num 2,001, price 70,000,000
suv - num 2,010, price 60,000,000
other - num 2,100, price 75,000,000
Я нашел способ сделать это с помощью Java с субагрегациями - что кажется очень неоптимальным.Есть ли другой способ сделать это?
GlobalAggregationBuilder topValues = AggregationBuilders.global("carmodels");
List<String> other = new ArrayList<>();
for (Map.Entry<String, List<String>> mappings : cars.entrySet()) {
List<String> carmodels = mappings.getValue();
other.addAll(carmodels);
String[] includes = carmodels.toArray(new String[carmodels.size()]);
topValues.subAggregation(AggregationBuilders.terms(mappings.getKey())
.field("carmodel")
.includeExclude(new IncludeExclude(includes, /*excludeValues*/ null)));
}
topValues.subAggregation(AggregationBuilders.terms("Other")
.field("carmodel")
.includeExclude(new IncludeExclude(/*includeValues*/ null, excludes.toArray(new String[excludes.size()]))));
Спасибо за вашу помощь / совет.