当前位置: 首页 > 知识库问答 >
问题:

使用聚合结果构造示例SearchResponse对象以进行测试

阎啸
2023-03-14

我想创建一个带有聚合结果的searchResponse对象以进行测试。

我尝试了以下方法

SearchResponseSections section = new SearchResponseSections(null, null, .......);

这里的第一个参数用于我不想要的点击,但第二个参数接受聚合。

现在,我无法使用bucket创建自定义聚合对象。

测试代码如下:

public AutoCompleteResponseDto getAutoCompleteResponse(SearchResponse searchResponse, String field, int limit) {
  Terms aggregation = searchResponse.getAggregations().get("typeAhead");
  final Set<String> bucketKeys = aggregation.getBuckets().stream().map(Terms.Bucket::getKeyAsString).collect(Collectors.toSet());
  return AutoCompleteResponseDto.builder().totalCount(bucketKeys.size()).values(bucketKeys).field(field).build();
}

我还尝试使用Json创建SearchResponse,如下所示:

public static List<NamedXContentRegistry.Entry> getDefaultNamedXContents() {
  Map<String, ContextParser<Object, ? extends Aggregation>> map = new HashMap<>();
  map.put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c));
  return map.entrySet().stream().map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey(), entry.getValue()))).collect(Collectors.toList());
}

public static SearchResponse getSearchResponse(String jsonString) {
  try {
    NamedXContentRegistry registry = new NamedXContentRegistry(getDefaultNamedXContents());
    XContentParser parser = new JsonXContentParser(registry, new JsonFactory().createParser(jsonString));
    return SearchResponse.fromXContent(parser);
  } catch (Exception ex) {
  }
  return new SearchResponse(); 
}

我使用以下json调用getSearchResponse(json)方法

{
  "took": 65,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "aggregations": {
    "typeAhead": {
      "buckets": [
        {
          "key": "1002312321",
          "docCount": 31521
        }
      ]
    }
  }
}

并获取ParseException:[无法解析键为[typeAhead]]的聚合。

ElasticSearch版本=5.6.15

注:如果有错别字,请忽略。

共有1个答案

甘君之
2023-03-14

通过在json中将聚合键作为术语#typeAhead而不是仅使用typeAhead来解决问题。

聚合键应作为aggType#key给出,并且给定聚合类型的条目应在NamedXContent注册表中注册。

 类似资料:
  • 我的MongoDB数据库有一个结构 每个a文档都有一个带有bool值vield“result”。我进行聚合选择: 并得到一个结果: 如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:

  • 问题内容: 根据上述问题,我用Val给定的脚本进行的elasticsearch查询在最后一周之前都可以正常工作。我们已经升级了ES版本,但突然停止了工作。 现在突然我的ES停止使用脚本中包含“ as Integer”的代码。任何人都可以检查和帮助。 我尝试了给定的查询,现在它抛出以下异常。 我作为参数传递的查询是: 由于我的索引器在该字段中包含1、2、4、6、14个值。但是执行完此查询后,我只得到

  • 我想在多个字段上进行日期直方图/范围聚合,并将结果存储在其他集合/索引中。因此,我可以在小时范围内使用查询/聚合使doc_count和。 聚合如下: 结果不出所料: 假设我解析了响应,并尝试将结果存储在其他索引/集合中。 存储聚合结果的最佳方式是什么,这样我就可以进行其他查询/聚合,以求和不同小时范围之间的“doc_count”? 例如:在“2016-07-17t00:00.000z”-“2016

  • 问题内容: 有一个对话列表,每个对话都有一个消息列表。每个消息都有一个不同的字段和一个字段。我们需要考虑的是,在对话的第一条消息中使用了动作,在几条消息中使用了动作之后,过了一会儿,依此类推(有一个聊天机器人意图列表)。 将对话的消息动作分组将类似于: 问题: 我需要使用ElasticSearch创建一个报告,该报告将返回每次会话的;接下来,我需要对类似的东西进行分组并添加一个计数;最终将导致as

  • 我正在测试Django 1.6应用程序,需要使用和提供一些指导。我们的Django应用程序具有以下结构: 我们顶部的目录有一个目录,其中包含我们所有的Django应用程序。当我测试完整的应用程序时,我收到了单个应用程序内每个包/模块的巨大覆盖输出。但是,我希望将覆盖结果(语句、未命中、覆盖%)分组到应用级别,而不是单个文件级别。 我能做这个吗? 以下是我的相关要求: