假设学生和考试设置为父子文档关系。
每一个学生有多次考试,怎么查询 2017-12-31考试成绩比2017-09-30的分数高的所有学生?
比如在下面的例子中,学生AAA分数50->80,满足条件;而学生BBB分数90->40,不满足条件。
PUT /idx
{
"mappings": {
"student": {},
"exam": {
"_parent": {
"type": "student"
}
}
}
}
POST /idx/student/_bulk
{ "index": { "_id": "1" }}
{ "name": "AAA"}
{ "index": { "_id": "2" }}
{ "name": "BBB"}
POST /idx/exam/_bulk
{ "index": { "_id": 1, "parent": "1" }}
{ "date":"2017-09-30", "score":50}
{ "index": { "_id": 2, "parent": "1" }}
{ "date":"2017-12-31", "score":80}
{ "index": { "_id": 3, "parent": "2" }}
{ "date":"2017-09-30", "score":90}
{ "index": { "_id": 4, "parent": "2" }}
{ "date":"2017-12-31", "score":40}
每一个学生有多次考试,怎么查询 2017-12-31考试成绩比2017-09-30的分数高的所有学生?
比如在下面的例子中,学生AAA分数50->80,满足条件;而学生BBB分数90->40,不满足条件。
PUT /idx
{
"mappings": {
"student": {},
"exam": {
"_parent": {
"type": "student"
}
}
}
}
POST /idx/student/_bulk
{ "index": { "_id": "1" }}
{ "name": "AAA"}
{ "index": { "_id": "2" }}
{ "name": "BBB"}
POST /idx/exam/_bulk
{ "index": { "_id": 1, "parent": "1" }}
{ "date":"2017-09-30", "score":50}
{ "index": { "_id": 2, "parent": "1" }}
{ "date":"2017-12-31", "score":80}
{ "index": { "_id": 3, "parent": "2" }}
{ "date":"2017-09-30", "score":90}
{ "index": { "_id": 4, "parent": "2" }}
{ "date":"2017-12-31", "score":40}
2 个回复
kennywu76 - Wood
赞同来自: venyowang 、zx3271234
查询结果:
解释一下这个查询的含义:
最后的聚合结果里, is_score_highter的值是true的,表明对应的key满足查询条件。 应用端基于这个值过滤一下就可以了。 本来想利用bucket selector aggreation,将聚合结果直接再过滤一下,但实验了一下发现其不支持对scripted_metric的处理,所以我也只能做到这一步了。
另外reduce script写得比较粗糙,使用某个key之前没有判断key是否存在,你可以自己完善一下。
zx3271234
赞同来自:
我现在的方案是:
把考试的分数转换为文档的评分,2017-12-31日的取正,2017-09-30的取负,其他的过滤掉,然后把所有的文档评分相加得到父文档的评分。父文档评分>0的就满足要求。
还想请问一下,怎么在查询父文档的script中访问子文档的字段?