Создайте образец объекта SearchResponse с результатом агрегирования для тестирования

#java #elasticsearch #mockito

#java #elasticsearch #mockito

Вопрос:

Я хочу создать объект SearchResponse с результатами агрегирования для тестирования.

Я попробовал следующее

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

Первый параметр здесь предназначен для обращений, которые мне не нужны, но второй параметр, который принимает агрегации.

Теперь я не могу создать пользовательский объект агрегации с помощью сегментов.

Код для тестирования выглядит следующим образом:

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

Я также попытался создать SearchResponse с использованием Json следующим образом:

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

Я вызываю метод getSearchResponse(json) со следующим 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

PS: Пожалуйста, игнорируйте опечатку, если таковая имеется.

Комментарии:

1. Вероятно, в вашем JSON отсутствуют два следующих свойства: doc_count_error_upper_bound и sum_other_doc_count . Смотрите это

2. Также пытался добавить эти свойства — не повезло. При дальнейшей отладке я вижу, когда вызов переходит к методу parseTypedKeysObject() класса XContentParserUtils. Разделение по агрегированным ключам (typeAhead) происходит с помощью разделителя #.

Ответ №1:

Проблема была решена путем предоставления ключа агрегации в виде терминов#typeAhead в json вместо только typeAhead.

Ключ агрегации должен быть указан как aggType#key, а запись для данного типа агрегации должна быть зарегистрирована в NamedXContentRegistry.