我正在跟踪少数学生的出勤情况。我将他们的详细信息存储在索引中,如下所示。
";条目";几乎没有其他领域。下面的数据显示,一名学生已经上了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"
}
}
}
}
}
}
}
}
}
}
}
}
}
}