具有中间结果的Elasticsearch查询

时间:2016-10-12 21:49:49

标签: elasticsearch

我是elasticsearch的新手,我有问题有效地查询它。我有以下类型的对象:

  • Teacher
  • Class
  • TeacherClass(包含整数字段teacher_idclass_id
  • Event(带整数字段teacher_class_id

所以结构看起来像这样:

___________       _______________      _________
| Teacher |_____/| TeacherClass |\_____| Class |
|_________|     \|______________|/     |_______|
                        |
                        |
                    ___/_\___                     
                    | Event |
                    |_______|

我想获得与给定教师相关的活动数量。目前,我通过两个查询来执行此操作:

  • TeacherClass上搜索查询(以获取TeacherClass ID数组)
  • Event计数查询(计算teacher_class_id等于数组中某个值的事件)。

有没有办法在单个查询中执行此操作?

1 个答案:

答案 0 :(得分:0)

此处的关键字为非规范化。您需要对数据进行非规范化,以便每个文档包含以下字段:

{
    "teacher_id": 1,
    "teacher_name": "John Math",
    "class_id": 2,
    "class_name": "Math",
    "event_id": 3,
    "event_name": "My Event"
}

然后,您可以使用terms上的teacher_id聚合汇总数据,并使用value_count上的event_id子聚合查看您有多少不同的事件。

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "teachers": {
      "terms": {
        "field": "teacher_id"
      },
      "aggs": {
        "events": {
          "value_count": {
            "field": "event_id"
          }
        }
      }
    }
  }
}