使用elasticsearch中的嵌套字段执行多字段/多维聚合

eimct9ow  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(510)

我在跟踪几个学生的出勤情况。我将他们的详细信息存储在索引中,如下所示。
“entries”中的每个文档几乎没有其他字段。以下数据显示一个学生在“星期一”上了6节课。
“条目”的类型为“嵌套”

{
      reg_id: 1111,
      "entires" : [
        {
          id: "123"
          day: 'Monday'
        },
        {
          id: "1234",
          attendance: true
        },
        {
          id: "12345",
          classes_attended: 6
        }
      ],
    }

我要数一数你每天上的每节课的学生人数。
例如“为“星期一”找到72个学生条目,他们参加了6节课”
示例所需输出-这只是一个示例,如果输出模式发生更改,我完全可以。

[
      {
        "day" : "monday", 
        "classes_attended": 6,
        count: 4
      },
      {
        "day" : "monday", 
        "classes_attended": 1,
        count: 5
      },
      {
        "day" : "tuesday", 
        "classes_attended": 5,
        count: 2
      },
      {
        "day" : "tuesday", 
        "classes_attended": 6,
        count: 1
      }
    ]

不确定如何开始聚合查询:
我尝试了以下查询,但我知道它不是正确的解决方案

"aggs": {
    "attendance_aggs": {
      "nested": {
        "path": "entries"
      },
      "aggs": {
        "days": {
          "terms": {
            "field": "entries.day"
          },
          "aggs": {
          "attended": {
            "reverse_nested": {},
            "aggs":{
              "class_attended_day": {
                "terms": {
                  "field": "entries.classes_attended"
                },
                "aggs": {
                  "class_attended_days_count": {
                    "reverse_nested": {},
                    "aggs": {
                      "classes_attended_final": {
                        "cardinality": {
                          "field": "entries.class_attended"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        }
      }
    }
  }
q5iwbnjs

q5iwbnjs1#

目前还不清楚顶层对象是什么,所以我假设它是“每天的学生出勤记录”。我也不确定 entries.ids 但我想你以后会需要它们的,所以我会让它们保持原样。
现在,既然你 entries 对象的共同点是 id ,它们可以解耦。意思是你应该使用 nested 如果有,仅当您在需要保留其属性连接的所有对象上共享某些属性时。因为我看不见 entries.id 在AGG中的任何地方,我都建议对Map进行以下调整:

PUT students
{
  "mappings": {
    "properties": {
      "day": {                ------------
        "type": "keyword"                |
      },                                 |
      "attendance": {                    |                                
        "type": "boolean"                | <--
      },                                 |
      "classes_attended": {              |
        "type": "integer"                |
      },                     ------------
      "entries": {
        "type": "nested",
        "properties": {
          "day": {
            "type": "keyword",
            "copy_to": "day"               <--
          },
          "attendance": {
            "type": "boolean",
            "copy_to": "attendance"        <--
          },
          "classes_attended": {
            "type": "integer",
            "copy_to": "classes_attended"  <--
          }
        }
      }
    }
  }
}

你的问题是:

GET students/_search
{
  "size": 0,
  "aggs": {
    "days": {
      "terms": {
        "field": "day"
      },
      "aggs": {
        "classes_attended": {
          "terms": {
            "field": "classes_attended"
          },
          "aggs": {
            "student_count": {
              "cardinality": {
                "field": "_id"
              }
            }
          }
        }
      }
    }
  }
}

然后可以将响应后处理为您喜欢的任何内容。
编辑
你可以劫持 reverse_nested 但在引用其他嵌套条目时需要返回到它:

GET students/_search
{
  "size": 0,
  "aggs": {
    "attendance_aggs": {
      "nested": {
        "path": "entries"
      },
      "aggs": {
        "days": {
          "terms": {
            "field": "entries.day"
          },
          "aggs": {
            "attended": {
              "reverse_nested": {},
              "aggs": {
                "class_attended_day": {
                  "nested": {
                    "path": "entries"
                  },
                  "aggs": {
                    "class_attended_day": {
                      "terms": {
                        "field": "entries.classes_attended"
                      },
                      "aggs": {
                        "classes_attended_final": {
                          "cardinality": {
                            "field": "entries.classes_attended"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

相关问题