构造带有聚合结果的示例 SearchResponse 对象以进行测试
Construct sample SearchResponse object with aggreagtion result for testing
我想创建一个带有聚合结果的 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();
}
我还尝试使用 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
PS: 如有错字请忽略
通过在 json 中将聚合键作为 terms#typeAhead 而不是仅使用 typeAhead 来解决问题。
聚合键应为 aggType#key
给定聚合类型的条目应该在 NamedXContentRegistry 中注册。
我想创建一个带有聚合结果的 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();
}
我还尝试使用 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
PS: 如有错字请忽略
通过在 json 中将聚合键作为 terms#typeAhead 而不是仅使用 typeAhead 来解决问题。
聚合键应为 aggType#key 给定聚合类型的条目应该在 NamedXContentRegistry 中注册。