Количество сегментов, возвращаемых субагрегацией - PullRequest
1 голос
/ 15 мая 2019

Мне нужно посчитать количество сегментов из набора результатов, возвращенного агрегацией каналов .Проблема в том, что мой запрос, использующий селектор сценариев здесь:

POST visitor_carts/_search
{
  "size": 0,
  "aggs": {
    "visitors": {
      "terms": {"field" : "visitor_id"},
      "aggs": {
        "one_purchase": {
          "bucket_selector": {
            "buckets_path": {
              "nb_purchases": "_count"
            },
            "script": "params.nb_purchases == 3"
          }
        }
      }
    }
  }
}

возвращает что-то вроде этого:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "visitors" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "2",
          "doc_count" : 3
        },
        {
          "key" : "3",
          "doc_count" : 3
        }
      ]
    }
  }
}

Под ключом buckets я вижусписок посетителей, удовлетворяющих моему условию (у каждого посетителя, обозначенного visitor_id, должно быть ровно три документа в индексе visitor_carts), но это не очень полезно, поскольку вместо него должны обрабатываться сотни тысяч посетителей.Я использую PHP для обработки результатов, теоретически он может считать набор результатов, но при большом количестве посетителей это кажется не самой лучшей идеей.Есть ли способ просто вывести количество допустимых интервалов рядом с doc_count_error_upper_bound и sum_other_doc_count?Немного странно, что в статистику агрегации не включено bucket_count, поскольку это представляется весьма полезным.

Или, может быть, это можно сделать по-другому?Этот вопрос является продолжением этого вопроса: Получите количество пользователей, совершивших определенное количество покупок

Вот мое visitor_carts отображение:

{
  "mapping": {
    "_doc": {
      "dynamic": "false",
      "properties": {
        "created_dt": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "order_id": {
          "type": "keyword"
        },
        "visitor_id": {
          "type": "keyword"
        }
      }
    }
  }
}

1 Ответ

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

Вы можете использовать Stats Bucket Aggregation , чтобы получить количество сегментов.

Ниже приведен ваш запрос.

Aggregation Query:

POST visitor_carts/_search
{
  "size": 0,
  "aggs": {
    "visitors": {
      "terms": {
        "field" : "visitor_id"
      },
      "aggs": {
        "one_purchase": {
          "bucket_selector": {
            "buckets_path": {
              "nb_purchases": "_count"
            },
            "script": "params.nb_purchases == 3"
          }
        }
      }
    },
    "mybucketcount":{
      "stats_bucket": {
        "buckets_path":"visitors._count"
      }
    }
  }
}

Результат агрегации:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "visitors": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "2",
          "doc_count": 3
        },
        {
          "key": "3",
          "doc_count": 3
        }
      ]
    },
    "mybucketcount": {
      "count": 2,              <---- This is the count you are looking for
      "min": 3,
      "max": 3,
      "avg": 3,
      "sum": 6
    }
  }
}

Дайте мне знать, если это поможет!

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