#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.