如何在 ElasticSearch 中为聚合创建子字段关键字

How to create subfield keyword for Aggregation in ElasticSearch

我正在尝试从 ElasticSearch 索引中获取聚合结果

例如,我的索引中的值

"_source": {
"ctry": "abc", 
"totalentry": 1,
"entrydate": "2022-01-06"
},
"_source": {
"ctry": "abc", 
"totalentry": 3,
"entrydate": "2022-01-07"
},
"_source": {
"ctry": "xyz", 
"totalentry": 1,
"entrydate": "2022-01-08"
}

预期的结果应该是根据国家

获得总条目
ctry : abc
totalentry : 4
ctry : xyz
totalentry : 1

我的聚合查询

  QueryBuilder querybuilder = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("entrydate")
                .gte("2022-01-01").lte ("2022-01-31"));      
      TermsAggregationBuilder groupBy = AggregationBuilders.terms("ctry").field("ctry");
      SearchQuery searchQuery = new NativeSearchQueryBuilder()
                        .withQuery(querybuilder).addAggregation(groupBy)
                        .build();
       List<Sample> records = elasticsearchRestTemplate.queryForList(searchQuery, Sample.class);

以上聚合查询返回 3 个记录而不是 2 个聚合结果。 我的索引属性

"ctry": {
"type": "keyword"

如何改成下面这样,希望能得到正确的聚合结果

ctry": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}

我的java代码

@Document(indexName="sample", createIndex=true, shards = 4)
public class Sample { 

     @Field(type = FieldType.Keyword)
     private String ctry;

您使用的是 Spring Data Elasticsearch 的过时版本。 queryForList 变体在 4.0 中已弃用,并已在 4.2 中删除。

您需要使用 search...() 方法之一 return 一个 SearchHits<Sample>> 对象。这将包含您查询的文档 聚合。