gpt4 book ai didi

elasticsearch - 使用 Elasticsearch 如何过滤日期范围内出勤率超过80%的员工

转载 作者:行者123 更新时间:2023-12-02 23:15:17 25 4
gpt4 key购买 nike

在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%的员工

最佳答案

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

Range Query

  • Terms Aggregation
  • Cardinality Aggregation on date field
  • Top Hits Aggregation (to retrieve the document)
  • Bucket Selector Aggregation

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

    为简单起见,我考虑过使用以下查询,该查询将从 1st-Jan-2019 to 10th-Jan-2019 返回出勤率大于或等于80%的员工的 列表,即仅返回 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,因为这是我在查询中使用的范围。

    希望这可以帮助!

    关于elasticsearch - 使用 Elasticsearch 如何过滤日期范围内出勤率超过80%的员工,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56070686/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com