Использование bucket_sort поверх bucket_selector - PullRequest
0 голосов
/ 27 марта 2020

Данные в эластичном формате 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
        }
    }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Я добился разбиения на страницы по агрегации, используя следующее:

{
    "query": {
        "bool": {
            "should": [
                {
                    "bool": {
                        "must": [
                            {
                                "bool": {
                                    "should": [
                                        {
                                            "range": {
                                                "doc_creation_timestamp": {
                                                    "from": 1559977347000,
                                                    "to": 1585897347091,
                                                    "include_lower": false,
                                                    "include_upper": false,
                                                    "boost": 1
                                                }
                                            }
                                        }
                                    ],
                                    "adjust_pure_negative": true,
                                    "boost": 1
                                }
                            },
                            {
                                "term": {
                                    "eventName": {
                                        "value": "delivered",
                                        "boost": 1
                                    }
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1
                    }
                },
                {
                    "bool": {
                        "must": [
                            {
                                "bool": {
                                    "should": [
                                        {
                                            "range": {
                                                "doc_creation_timestamp": {
                                                    "from": 1559977347000,
                                                    "to": 1585897347138,
                                                    "include_lower": false,
                                                    "include_upper": false,
                                                    "boost": 1
                                                }
                                            }
                                        }
                                    ],
                                    "adjust_pure_negative": true,
                                    "boost": 1
                                }
                            },
                            {
                                "term": {
                                    "eventName": {
                                        "value": "accepted",
                                        "boost": 1
                                    }
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
    "aggregations": {
        "group_by_user": {
            "terms": {
                "field": "user-details.user_id.keyword",
                "size": 1000,
                "min_doc_count": 1,
                "shard_min_doc_count": 0,
                "show_term_doc_count_error": false,
                "order": {
                    "_key": "asc"
                },
                "include": {
                    "partition": 0,
                    "num_partitions": 2
                }
            },
            "aggregations": {
                "group_by_eventName": {
                    "terms": {
                        "field": "eventName.keyword",
                        "size": 10,
                        "min_doc_count": 1,
                        "shard_min_doc_count": 0,
                        "show_term_doc_count_error": false,
                        "order": [
                            {
                                "_count": "desc"
                            },
                            {
                                "_key": "asc"
                            }
                        ]
                    }
                }
            }
        }
    }
}

Вы можете прочитать о включении в: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

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