动态词条桶

时间:2019-02-06 06:36:51

标签: java elasticsearch

我需要能够基于索引字段中的多个值即时存储数据。

例如-如果我的索引包含car models关键字类型(众所周知的有限列表)和汽车价格,我希望根据汽车类型进行汇总,以获取该模型的汽车数量和价格总和。 我知道最好的办法是将汽车型号信息保留在索引本身中,但这不是当前的选择。

我希望进行以下分组:

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()]))));

感谢您的帮助/建议。

0 个答案:

没有答案