使用弹性搜索如何过滤日期范围内出勤率超过80%的员工

时间:2019-05-10 04:24:44

标签: elasticsearch

在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%以上上班率的员工

1 个答案:

答案 0 :(得分:1)

我提出了以下解决方案,其中使用了以下提到的聚合查询。请注意查询的树结构,这将有助于理解父级/同级聚合。

Range Query

现在,我只是简单地使用范围查询来过滤将落入该范围的文档。

为简单起见,我考虑过使用以下查询,该查询将从 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,因为这是我在查询中使用的范围。

希望这会有所帮助!