【问题标题】:Elasticsearch Java client SearchResponse not recognizing aggregations/bucketsElasticsearch Java 客户端 SearchResponse 无法识别聚合/存储桶
【发布时间】:2019-04-24 07:41:47
【问题描述】:

Elasticsearch Java 客户端 SearchResponse 无法解析聚合结果。我在网上遇到过一些文章,这些文章建议在键前面添加聚合类型。我已经添加了我认为适用于我的用例的内容,例如“sterms# 和 sum#”,但我无法确定哪种类型适用于主过滤器(在我的情况下为键:'matched')。我期望存储桶对象被填充,但它目前作为一个空数组返回,尽管来自包含聚合的弹性搜索的响应。

注意:这是为了能够进行单元测试。

Json 响应:

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 75,
    "successful": 75,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 776329,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "sterms#matched": {
      "doc_count": 15,
      "sterms#id": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "mykey",
            "doc_count": 15,
            "sterms#manufacturerName": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "subkey",
                  "doc_count": 15
                }
              ]
            },
            "sum#totalCars": {
              "value": 214244
            },
            "sum#totalTrucks": {
              "value": 155738
            }
          }
        ]
      }
    }
  }
}

Java 中的解析器

public static SearchResponse getSearchResponseFromJson(final String jsonFileName) {
        try {
            String jsonResponse = IOUtils.toString(new FileInputStream(jsonFileName));
            NamedXContentRegistry registry = new NamedXContentRegistry(getDefaultNamedXContents());
            XContentParser parser = JsonXContent.jsonXContent.createParser(registry, jsonResponse);
            return SearchResponse.fromXContent(parser);
        } catch (IOException e) {
            throw new RuntimeException("Failed to get resource: " + jsonFileName, e);
        } catch (Exception e) {
            throw new RuntimeException(("exception " + e));
        }
    }

    private static List<NamedXContentRegistry.Entry> getDefaultNamedXContents() {
        Map<String, ContextParser<Object, ? extends Aggregation>> map = new HashMap<>();
        map.put(TopHitsAggregationBuilder.NAME, (parser, content) -> ParsedTopHits.fromXContent(parser, (String) content));
        map.put(StringTerms.NAME, (parser, content) -> ParsedStringTerms.fromXContent(parser, (String) content));
        map.put(SumAggregationBuilder.NAME, (parser, content) -> ParsedSum.fromXContent(parser, (String) content));
        //map.put(ScriptedMetricAggregationBuilder.NAME, (parser, content) -> ParsedScriptedMetric.fromXContent(parser, (String) content));
        List<NamedXContentRegistry.Entry> entries = map.entrySet()
                                                       .stream()
                                                       .map(entry -> new NamedXContentRegistry.Entry(Aggregation.class,
                                                               new ParseField(entry.getKey()),
                                                               entry.getValue()))
                                                       .collect(Collectors.toList());
        return entries;
    }

使用空存储桶解析响应(期望存储桶具有聚合 totalCars 和 totalTrucks)

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 75,
        "successful": 75,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 776329,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "sterms#matched": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
        }
    }
}

我不确定 sterms 是否适合过滤器

【问题讨论】:

标签: java elasticsearch


【解决方案1】:

需要使用什么类型的答案是“过滤器”(filter#matched)。而Java类对应的是FilterAggregationBuilder

【讨论】:

    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2019-04-25
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多