Spring Data Elasticsearch 4.4.x:如何从SearchHits中获取聚合?

slhcrj9b  于 2023-05-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(156)

我是Spring Data elasticsearch的新手。我正在做一个项目,在这个项目中,我正在索引不同项目中遇到的错误(只是举个例子)。
我想获取所有的项目,在每个项目的错误数。
以下是我的文档:

@Data
@Document(indexName = "all_bugs")
public class Bug{
    @Id
    private String recordId;
    private Project project;
    private String bugSummary;
    private String status;
    // other fields omitted for brevity
}

这是Project

@Data
public class Project {
    private String projectId;
    private String name;
}

现在所有的bug都在elasticsearch中,我可以在Kibana控制台中执行这个查询,得到***所有项目,每个项目中的bug计数***

GET /all_bugs/_search
{
  "size": 0,
  "aggs": {
    "distinct_projects": {
      "terms": {
        "field": "project.projectId",
        "size": 10
      },
      "aggs": {
        "project_details": {
          "top_hits": {
            "size": 1,
            "_source": {
              "includes": ["project.projectId", "project.name"]
            }
          }
        }
      }
    }
  }
}

虽然我知道我需要做得更好,但我面临的问题是Spring Data Elasticsearch部分。这是我构造聚合的方法。

@Autowired
    private ElasticsearchOperations elasticsearchOperations;

    public List<DistinctProject> getDistinctProjects() {
        TermsAggregationBuilder aggregation = AggregationBuilders
                .terms("distinct_projects")
                .field("projects.projectId")
                .size(10)
                .subAggregation(AggregationBuilders
                        .topHits("project_details")
                        .size(1)
                        .fetchSource(new String[]{"project.name", "project.projectId"}, null));

        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withAggregations(aggregation)
                .build();

        SearchHits<DistinctProject> searchHits = elasticsearchOperations.search(searchQuery, DistinctProject.class);

//I dont' know what to do from here...
    }

现在,我带着SearchHits<DistinctProject>。***问题是,我如何从这里获得聚合来构造我的响应?***在本例中,DistinctProject只是一个DTO,我想在其中存储projectIdnamedocCount,以便我可以创建一个List并将其返回给调用者。
现在,这里的问题是,到目前为止,我看过的所有文档都建议我实现searchHits.getAggregations().get("distinct_projects"),但这在我们正在使用的Spring Data Elasticsearch 4.4.11中不可用。根据这里的文件
SearchHits class does not contain the org.elasticsearch.search.aggregations.Aggregations了。相反,它现在包含org.springframework.data.elasticsearch.core.AggregationsContainer类的示例
因此,searchHits.getAggregations().get("distinct_projects")抛出一个编译错误。我不能再继续了。
我也引用了P.J.Meisch的答案,但这也引用了Spring Data Elasticsearch的旧版本
如果有人能帮我离开这个街区我会很感激的。
My spring Boot 版本是2.7.11,Spring Data elasticsearch版本是4.4.11。
谢了,斯里拉姆

hujrc8aj

hujrc8aj1#

我测试了你的代码。遗憾的是,Spring Data Elasticsearch中没有用于聚合的数据模型。但是你可以把聚合数据当作json,自己解析它。

@Test
        public void testCreate(){
            TermsAggregationBuilder aggregation = AggregationBuilders
                    .terms("distinct_projects")
                    .field("project.projectId") // your code here is wrong
                    .size(10)
                    .subAggregation(AggregationBuilders
                            .topHits("project_details")
                            .size(1)
                            .fetchSource(new String[]{"project.name", "project.projectId"}, null));

            NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withAggregations(aggregation)
                    .build();

            SearchHits<DistinctProject> searchHits = elasticsearchOperations.search(searchQuery, DistinctProject.class, IndexCoordinates.of("all_bugs2"));

            System.out.println(JSONObject.toJSONString(searchHits.getAggregations()));
        }

    {
            "asMap": {
                    "distinct_projects": {
                            "buckets": [{
                                    "aggregations": {
                                            "asMap": {
                                                    "project_details": {
                                                            "fragment": true,
                                                            "hits": {
                                                                    "fragment": true,
                                                                    "hits": [{
                                                                            "documentFields": {},
                                                                            "fields": {},
                                                                            "fragment": false,
                                                                            "highlightFields": {},
                                                                            "id": "tqpfM4gBOyQu5gYl2sOB",
                                                                            "matchedQueries": [],
                                                                            "metadataFields": {},
                                                                            "primaryTerm": 0,
                                                                            "rawSortValues": [],
                                                                            "score": 1.0,
                                                                            "seqNo": -2,
                                                                            "sortValues": [],
                                                                            "sourceAsMap": {
                                                                                    "project": [{
                                                                                            "name": "my project",
                                                                                            "projectId": 10
                                                                                    }]
                                                                            },
                                                                            "sourceAsString": "{\"project\":[{\"name\":\"my project\",\"projectId\":10}]}",
                                                                            "sourceRef": {
                                                                                    "fragment": true
                                                                            },
                                                                            "type": "_doc",
                                                                            "version": -1
                                                                    }],
                                                                    "maxScore": 1.0,
                                                                    "totalHits": {
                                                                            "relation": 0,
                                                                            "value": 1
                                                                    }
                                                            },
                                                            "name": "project_details",
                                                            "type": "top_hits"
                                                    }
                                            },
                                            "fragment": true
                                    },
                                    "docCount": 1,
                                    "docCountError": 0,
                                    "fragment": true,
                                    "key": 10,
                                    "keyAsNumber": 10,
                                    "keyAsString": "10"
                            }],
                            "docCountError": 0,
                            "fragment": true,
                            "name": "distinct_projects",
                            "sumOfOtherDocCounts": 0,
                            "type": "lterms"
                    }
            },
            "fragment": true
    }

相关问题