Данные в эластичном формате c хранятся отношения родитель-потомок, где пользователь является родителем, и для этого пользователя может быть n записей о событиях с полем, называемым состоянием, которое может быть запущено, в процессе перехода, завершено.
Я хочу получить пользователей, которые имеют более 5 событий, которые находятся в завершенном состоянии, я использовал bucket_selector для этого, а затем я хочу получить эту информацию в разбивке по страницам. Я пытался использовать bucket_sort вместо bucket_selector, но его ошибка выдает.
Мой запрос выглядит следующим образом:
{
"size": 0,
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"bool": {
"should": [
{
"range": {
"doc_creation_timestamp": {
"from": 1550658823000,
"to": 1585218823622,
"include_lower":false,
"include_upper": false
}
}
}
]
}
},
{
"term": {
"eventName": {
"value": "delivered"
}
}
}
]
}
}
]
}
},
"aggregations": {
"PERFORMED_DELIVERED": {
"terms": {
"field": "user-details.user_id.keyword"
},
"aggregations": {
"theTop": {
"bucket_selector": {
"buckets_path": {
"doc_count": "_count"
},
"script": {
"source": "params.doc_count>=3",
"lang": "painless"
},
"gap_policy": "skip"
}
}
}
}
}
}
, что дает следующий результат:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 22,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"PERFORMED_DELIVERED": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "tyygghgf34567",
"doc_count": 7
},
{
"key": "gtredfg3456",
"doc_count": 6
},
{
"key": "ytr4453w76y",
"doc_count": 5
},
{
"key": "fsert4wwqasd",
"doc_count": 4
}
]
}
}
}
mapping:
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"user": {
"type": "nested"
},
"event": {
"type": "nested"
},
"user_relations": {
"type": "join",
"relations": {
"user": "event"
}
}
}
}
}
пользовательский (родительский) документ:
{
"vehicle_color": "black",
"driver_type": "REGULAR",
"app_version": "11.0.2",
"activation_date": 1583298778169,
"doc_updation_timestamp": 1583298778169,
"vehicle_model": "gemini",
"mobile_no": "7643456",
"last_name": "G",
"driver_company": "DD",
"doc_type": "user",
"city_of_interest": "BANGALORE",
"middle_name": "A",
"doc_creation_timestamp": 1583298778169,
"market_name": "market",
"user_relations": {
"name": "user"
},
"user_id": "testuser1",
"onboarding_state": "YT",
"first_name": "testuser1",
"onboarding_date": 1583298778169,
"email": "mark@gmail.com",
"doc_timestamp": 1583916522000,
"status": "ACTIVE"
}
событие (дочерний) документ:
{
"eventID": "gsffg",
"doc_updation_timestamp": 1584079904792,
"tripId": "oi898-97-ghj-gtre43-qw233e43e",
"orderId-0-id": "65432415",
"doc_creation_timestamp": 1584079904792,
"user-details": {
"last_name": "G",
"vehicle_model": "gemini",
"mobile_no": "7643456",
"doc_type": "user",
"doc_timestamp": 1583916522000,
"city_of_nterest": "BANGALORE",
"driver_type": "REGULAR",
"app_version": "11.0.2",
"user_relations": {
"name": "user"
},
"first_name": "testuser1",
"market_name": "market",
"onboarding_date": 1583298778169,
"middle_name": "A",
"activation_date": 1583298778169,
"onboarding_state": "YT",
"user_id": "testuser1",
"vehicle_color": "black",
"email": "talk@gmail.com",
"doc_creation_timestamp": 1583298778169,
"doc_updation_timestamp": 1583298778169,
"status": "ACTIVE"
},
"user_relations": {
"parent": "testuser1",
"name": "event"
},
"estDeliveryTime-0-caption": 1579068000000,
"carrier": "TESTCARRIER",
"tenantId": 7,
"tripEndDateTime": 1579158943000,
"eventName": "ACCEPTED",
"tripStartDateTime": 1579155343000
}
Я хочу разбить этот результат на страницы. Пожалуйста, помогите мне в этом.
На данный момент я решил это с помощью has_child с min и max child. Это решает мою проблему разбиения на страницы и фильтрации по номеру дочернего объекта. Но я обеспокоен выполнением запроса:
{
"query": {
"bool": {
"should": [
{
"has_child": {
"query": {
"term": {
"eventName": {
"value": "delivered",
"boost": 1
}
}
},
"type": "event",
"score_mode": "none",
"inner_hits": {
"_source": [
"tripId",
"eventName",
"tripStartDateTime"
]
},
"min_children": 1,
"max_children": 10,
"ignore_unmapped": false,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
}