我已经为ES创建了一个查询,我正在尝试包含聚合。这些将显示在用户看到的页面一侧,以便他们可以进一步过滤其结果。这些中的每一个都会在它们旁边计数。让我解释一下我正在使用的模型,这样你就可以理解我正在寻找的计数。
以下是我的索引示例:
for (i in 1,2)
... fetch video file info
... fetch xml file info
upload
让我们说某人进行通配符搜索。他们会收到所有老师的名单。另一方面,他们将收到前50名学生姓名,用户可以使用这些名称进一步过滤他们的结果。此过滤器列表需要计算具有该特定学生的教师数量。但是,一个教师可能不止一次就有一个学生(例如,老师从一年级教学转到二年级,并且两年都有很多相同的学生)。
以下是我对ES的查询示例(我使用Nest):
"mappings": {
"teacher": {
"properties": {
"name": {
"type": "string"
},
"studentCount": {
"type": "integer"
}
}
},
"student": {
"_parent": {
"type": "teacher"
},
"properties": {
"name": {
"type": "string"
},
"classesCount": {
"type": "integer"
}
}
}
}
但是,由于DocCount正在计算子文档的数量,因此它通常高于与该特定学生对应的教师记录的实际数量。我也尝试过添加基数聚合
return await elasticClient.SearchAsync<TeacherModel>(s => s
.Index(index)
.Type("teacher")
.Query(q => builtQuery)
.Aggregations(a => a
.Children<StudentModel>("Students", c => c
.Type("student")
.Aggregations(ca => ca
.Terms("Students", t => t
.Field("name")
.Size(50))))));
这可以让我更接近,有时它甚至是正确的。我尝试使用PrecisionThreshold值进行调整,但即使这样,在处理〜2,000,000个教师文档时,有时也会被数千个记录关闭。有没有办法准确或更准确地计算这些父文件?