elasticsearch - 使用弹性搜索如何过滤某个日期范围内出勤率超过 80% 的员工
问题描述
在弹性搜索中,我试图过滤给定日期范围内出勤率超过 80% 的员工。
模型是 { userId_ids:1, AvailableDays:["2019-05-10","2019-05-11","2019-05-12",......,"2019-12-30"] }
可用性天数可以是 5 年的数据,需要获取日期范围“2019-01-01”-“2019-12-30”内可用性超过 80% 的所有员工
解决方案
我提出了以下解决方案,其中我使用了下面提到的聚合查询。请注意查询的树结构,这将有助于理解父/兄弟聚合。
现在,我首先简单地使用 Range 查询来过滤该范围内的文档。
为简单起见,我考虑使用以下查询,该查询将返回出勤率大于或等于 80% 的员工列表,即1st-Jan-2019 to 10th-Jan-2019
仅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,因为这是我在查询中使用的范围。
希望这可以帮助!
推荐阅读
- python - sklearn 中的 predict_proba 如何产生两列?它们的意义是什么?
- android - Android Glide 不会从 url 加载 .jpg
- c++ - 无法使用对象访问迭代器数据成员
- mongodb - 是否可以在 mongo 文本搜索中排除/否定短语?
- apache-kafka - 如何使用 KStream 发送标头
- http - 如何在 Cloudflare Workers 中不丢失 301 https 重定向的引用值
- python-3.5 - Python请求SyntaxError:无效的语法
- python - 通过子进程关闭PC后会发生什么?
- java - 在 opencv 4.1.0 中无法解析 DescriptorExtractor 和 FeatureDetector 的导入
- javascript - How to preload script using integrity and crossorigin