首页 > 解决方案 > 使用弹性搜索如何过滤某个日期范围内出勤率超过 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% 的所有员工

标签: elasticsearch

解决方案


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

Range Query

现在,我首先简单地使用 Range 查询来过滤该范围内的文档。

为简单起见,我考虑使用以下查询,该查询将返回出勤率大于或等于 80% 的员工列表,1st-Jan-2019 to 10th-Jan-201910 天

请注意,我在需要更改查询的地方添加了一些注释,具体取决于您的用例

聚合查询

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,因为这是我在查询中使用的范围。

希望这可以帮助!


推荐阅读