Представьте себе следующий вариант использования:
Мы работаем в Stark Airlines, и наша маркетинговая команда хочет сегментировать наших пассажиров, чтобы предоставить им скидки или подарочные карты. Они решают, что им нужны две группы пассажиров:
- Пассажиры, которые летают не менее 3 раз в неделю
- Пассажиры, которые летали хотя бы один раз, но которые не летали в течение двух недель
При этом они могут проводить различные маркетинговые кампании для наших пассажиров!
Итак, в поиске elasti c у нас есть индекс trip
, который представляет билет, купленный пассажиром:
{
"_index" : "trip",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"total_amount" : 300,
"trip_date" : "2020/03/24 13:30:00",
"status" : "completed",
"passenger" : {
"id" : 11,
"name" : "Thiago nunes"
}
}
}
Индекс trip
содержит поле status
, которое может иметь другие значения, такие как: pending
или open
или canceled
Это означает, что мы можем только принять во внимание поездки, которые имеют статус completed
(имеется в виду, что пассажир действительно путешествовал).
Итак, учитывая все это ... Как бы я получил эти две группы пассажиров с помощью поиска elasti c ?
Я пытался некоторое время, но безуспешно.
Что я делал до сих пор:
- Я построил запрос, который получает все действительные поездки (поездки со статусом
completed
)
GET /trip/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"status": {
"value": "completed"
}
}
}
]
}
},
"aggs": {
"status_viagem": {
"terms": {
"field": "status.keyword"
}
}
}
}
Этот запрос возвращает следующее:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 200,
"relation" : "eq"
},
"max_score" : 0.18232156,
"hits" : [...]
},
"aggregations" : {
"status_viagem" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "completed",
"doc_count" : 200
}
]
}
}
}
Но я застрял и не могу понять следующий шаг. Я знаю, что следующее, что нужно сделать, - создать группы с пассажирами, а затем отфильтровать их в две группы, представляющие желаемые наборы данных. Но я не знаю как.
Может ли кто-нибудь помочь?
PS .:
Мне точно не нужно, чтобы это было одно запрос, просто подсказка о том, как создать такой запрос, было бы очень полезно
Выход должен быть массивом идентификатора пассажира
Примечание: для простоты я сократил индекс trip