在弹性搜索中使用嵌套字段执行多字段/多维聚合



我正在跟踪少数学生的出勤情况。我将他们的详细信息存储在索引中,如下所示。

";条目";几乎没有其他领域。下面的数据显示,一名学生已经上了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"
}
}
}
}
}
}
}
}
}
}
}
}
}

不清楚顶层对象是什么,所以我假设它是一个"学生每天出勤记录";。我也不确定entries.ids代表什么,但我认为您稍后会需要它们,所以我会保持它们不变。

现在,由于entries对象的共同点是id,所以它们可以解耦。这意味着您应该使用nested(如果有的话(,前提是您在所有需要保留属性连接的对象中共享一些属性。由于我在你的aggs中没有看到entries.id,我建议对你的映射进行以下调整:

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"
}
}
}
}
}
}
}
}
}
}
}
}
}
}

最新更新