如何获得每行特定的总分

时间:2015-07-07 07:12:29

标签: elasticsearch

我需要,Elasticsearch GET查询通过将他们在所有科目中获得的分数加起来来查看每个学生的总分,而不是我得到每个科目中所有学生的总分。

GET /testindex/testindex/_search
{
  "query" : {
    "filtered" : {
        "query" : { 
          "match_all" : {}
        }
    }
 },
 "aggs": {
    "total": {
        "sum": {
           "script" : "doc['physics'].value + doc['maths'].value + doc['chemistry'].value"
         }
     }
  }
}

输出

  {
    ....
   "hits": [
     {
        "_index": "testindex",
        "_type": "testindex",
        "_id": "1",
        "_score": 1,
        "_source": {
           "personalDetails": {
              "name": "viswa",
              "age": "33"
           },
           "marks": {
              "physics": 18,
              "maths": 5,
              "chemistry": 34
           },
           "remarks": [
              "hard working",
              "intelligent"
           ]
        }
     },
     {
        "_index": "testindex",
        "_type": "testindex",
        "_id": "2",
        "_score": 1,
        "_source": {
           "personalDetails": {
              "name": "bob",
              "age": "13"
           },
           "marks": {
              "physics": 48,
              "maths": 45,
              "chemistry": 44
           },
           "remarks": [
              "hard working",
              "intelligent"
           ]
        }
     }
  ]
  },
  "aggregations": {
     "total": {
        "value": 194
     }
  }
 }

预期产出:

我想在每个学生的科目中获得总分,而不是所有学生的总分。

我需要在查询中进行哪些更改才能实现此目的。

1 个答案:

答案 0 :(得分:1)

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      }
    }
  },
  "aggs": {
    "student": {
      "terms": {
        "field": "personalDetails.name",
        "size": 10
      },
      "aggs": {
        "total": {
          "sum": {
            "script": "doc['physics'].value + doc['maths'].value + doc['chemistry'].value"
          }
        }
      }
    }
  }
}

但是,请注意,对于student terms汇总,您需要一个"唯一的" (使该学生独特的东西 - 比如个人ID或其他东西)字段,也许是_id本身,但你需要store它。