繁体   English   中英

Elasticsearch按嵌套字段分组

[英]Elasticsearch grouping by nested fields

有没有办法按嵌套字段分组并在非嵌套字段上执行聚合?

我在ES中有这样的数据

{
    "_index": "bighalf",
    "_type": "excel",
    "_id": "AVE0rgXqe0-x669Gsae3",
    "_score": 1,
    "_source": {
      "Name": "Marsh",
      "date": "2015-11-07T10:47:14",
      "grade": 9,
      "year": 2016,
      "marks": 70,
      "subject": "Mathematics",
      "Gender": "male",
      "dob": "22/11/2000",
      "sprint": [
        {
          "sprintdate": "2015-11-06T22:30:00",
          "sprintname": "changed",
          "sprintpoints": 52
        }
      ]
    }
  },
  {
    "_index": "bighalf",
    "_type": "excel",
    "_id": "AVE0rvTHe0-x669Gsae5",
    "_score": 1,
    "_source": {
      "Name": "Taylor",
      "date": "2015-11-07T10:47:14",
      "grade": 9,
      "year": 2016,
      "marks": 54,
      "subject": "Mathematics",
      "Gender": "male",
      "dob": "22/11/2000",
      "sprint": [
        {
          "sprintdate": "2015-11-07T22:30:00",
          "sprintname": "jira",
          "sprintpoints": 52
        }
      ]
    }
  }

我想按sprintname并找到marks总和

我试过这样的:

SumBuilder sumGrades = AggregationBuilders.sum("sum_grade").field("grade");
NestedBuilder nested = AggregationBuilders.nested("nested").path("sprint")
.subAggregation(AggregationBuilders.terms("by_sprint").field("sprint.sprintname").subAggregation(sumGrades));
String names[] = { "changed", "jira" };
QueryBuilder query = QueryBuilders.boolQuery().must(
QueryBuilders.nestedQuery("sprint",QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("sprint.sprintname", names))));
FilterAggregationBuilder aggregation = AggregationBuilders.filter("agg").filter(query).subAggregation(nested);

sum_grade对我不起作用。 但是我用嵌套字段( sprintpoints )更改了字段( grade )并且它工作但是我的要求是通过sprint.sprintname找到sum("grade")和group。

由于您的sprint字段是nested类型,因此在您的聚合中,您需要使用reverse_nested聚合 ,以便从嵌套文档中“跳回”根文档。 它是这样的:

SumBuilder sumGrades = AggregationBuilders.sum("sum_grade").field("grade");

ReverseNestedBuilder backToGrades = AggregationBuilders.reverseNested("spring_to_grade")
    .subAggregation(sumGrades);

TermsBuilder bySprint = AggregationBuilders.terms("by_sprint")
    .field("sprint.sprintname").subAggregation(backToGrades)

NestedBuilder nested = AggregationBuilders.nested("nested").path("sprint")
    .subAggregation(bySprint);

String names[] = { "changed", "jira" };
QueryBuilder query = QueryBuilders.boolQuery().must(
QueryBuilders.nestedQuery("sprint",QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("sprint.sprintname", names))));
FilterAggregationBuilder aggregation = AggregationBuilders.filter("agg").filter(query).subAggregation(nested);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM