在Elastic search中,我试图过滤给定日期范围内出勤率超过80%的员工。
型号为 { userId_ids:1, 可用天数:[“ 2019-05-10”,“ 2019-05-11”,“ 2019-05-12”,......,“ 2019-12-30”] }
上班天数可以是5年数据,并且需要在“ 2019-01-01”-“ 2019-12-30”日期范围内获取所有拥有80%以上上班率的员工
答案 0 :(得分:1)
我提出了以下解决方案,其中使用了以下提到的聚合查询。请注意查询的树结构,这将有助于理解父级/同级聚合。
现在,我只是简单地使用范围查询来过滤将落入该范围的文档。
为简单起见,我考虑过使用以下查询,该查询将从 1st-Jan-2019 to 10th-Jan-2019
<中返回出勤率大于或等于80%的员工列表 / strong>,即仅 10天。
请注意,我已根据您的用例在需要更改查询的位置添加了一些注释
POST <your_index_name>/_search
{
"size": 0,
"query":{
"range": {
"availabilityDates": {
"gte": "2019-01-01",
"lte": "2019-01-10"
}
}
},
"aggs":{
"student":{
"terms":{
"field":"userId.keyword"
},
"aggs":{
"count_dates_attendance":{
"cardinality":{
"field":"availabilityDates"
}
},
"hits": {
"top_hits": {
"size": 10 <---- Returns only 10 students. Change to see more students
}
},
"myfinal":{
"bucket_selector":{
"buckets_path":{
"attendanceCount":"count_dates_attendance"
},
"script": {
"params": {
"count_days": 10 <----- Change this to 365 if your range is for an entire year
},
"inline": "params.attendanceCount/params.count_days >= 0.8"
}
}
}
}
}
}
}
您唯一需要做的就是手动计算两天之间的天数,并根据您的要求更新count_days
。我添加了10,因为这是我在查询中使用的范围。
希望这会有所帮助!