Использование эластичного поиска, как отфильтровать сотрудников с посещаемостью более 80% в диапазоне дат - PullRequest
1 голос
/ 10 мая 2019

В поиске Elastic я пытаюсь отфильтровать сотрудников с посещаемостью более 80% за указанный диапазон дат.

Модель: {userId_ids: 1, AvailableDays: ["2019-05-10", "2019-05-11 "," 2019-05-12 ", ......," 2019-12-30 "]}

Дни доступности могут быть данными за 5 лет, и их необходимо собрать для всех сотрудников сболее 80% доступности в диапазоне дат «2019-01-01» - «2019-12-30»

1 Ответ

1 голос
/ 10 мая 2019

Я предложил следующее решение, в котором я использовал нижеуказанные агрегационные запросы.Обратите внимание на древовидную структуру запроса, которая поможет понять агрегаты родителя / брата.

Range Query

Теперь я просто использовалRange Range сначала фильтрует документы, попадающие в этот диапазон.

Для простоты я рассмотрел использование нижеприведенного запроса, который вернул бы список сотрудников, чья посещаемость больше или равна 80% с 1st-Jan-2019 to 10th-Jan-2019 то есть только на 10 дней .

Обратите внимание, что я добавил несколько комментариев, где бы это ни требовалось, чтобы изменить запрос в зависимости от вашего варианта использования

Aggregation Query

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"
                  }
               }
            }
         }
      }
   }
}

Единственное, что вам нужноdo - вручную рассчитать количество дней между двумя днями и обновить count_days в соответствии с вашими требованиями.Я добавил 10, потому что это диапазон, который я использовал в своем запросе.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...