Запрос агрегации ES для получения родительских документов на основе условий, применяемых к результатам агрегации дочерних документов в ES?

Я использую ES v7.3, и у меня есть сопоставление родитель-потомок в моем индексе, я хочу квалифицировать родительские документы в своем индексе на основе некоторых результатов агрегирования, примененных к дочерним документам, но я не могу этого сделать, вот ссылка на Что мне нужно...

Отображение индекса:

PUT example
{
  "mappings": {
    "properties": {
      "join": {
        "type": "join",
        "relations": {
          "user": "session"
        }
      }
    }
  }
}

Родительский документ:

PUT example/_doc/1
{
  "join": {
    "name": "user"
  },
  "type": "identify",
  "device": "xx"
  "profileId": "1052210",
  "updatedAt": "2020-12-30T17:06:22.851Z"
}

1-й детский документ:

PUT example/_doc/2?routing=1
{
  "join": {
    "name": "session",
    "parent": "1"
  },
  "page_view_count": 10,
  "creation_date": "2020-12-30T13:45:37.851Z"
}

2-й детский документ:

PUT example/_doc/3?routing=1
{
  "join": {
    "name": "session",
    "parent": "1"
  },
  "page_view_count": 20,
  "creation_date": "2020-12-30T13:45:37.851Z"
}

Требование:

  1. Пользователи, у которых page_view_count > 25 за последние 7 дней, поэтому мы хотели агрегировать page_view_count в дочерних документах и ​​проверить, равна ли их сумма > 25 или нет, если она удовлетворяет условию, то мы должны получить родительский документ в ответ, иначе нет.

ПРИМЕЧАНИЕ. Эти дочерние документы формируются для каждого сеанса пользователя, и, следовательно, подсчет ведется в документах ES для сеанса.


person Yash Tandon    schedule 30.12.2020    source источник


Ответы (1)


Вот одно решение, возвращающее только profileId:

POST example/_search
{
  "size": 0, 
  "aggs": {
    "users": {
      "terms": {
        "field": "profileId.keyword",
        "size": 10
      },
      "aggs": {
        "sessions": {
          "children": {
            "type" : "session" 
          },
          "aggs": {
            "last_7_days": {
              "filter": {
                "range": {
                  "creation_date": {
                    "gte": "now-7d",
                    "lte": "now"
                  }
                }
              },
              "aggs": {
                "page_view_count": {
                  "sum": {
                    "field": "page_view_count"
                  }
                }
              }
            }
          }
        },
        "page_view_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "viewCount": "sessions > last_7_days > page_view_count"
            },
            "script": "params.viewCount >= 25"
          }
        }
      }
    }
  }
}
person x4k3p    schedule 31.12.2020
comment
Поддерживается ли агрегация для запуска вместе с прокруткой в ​​​​ES, я так не думаю, потому что я прокручиваю свои документы с результатами, имеющими размер фрагмента 10 КБ, но с помощью этой агрегации Bucket_selector я не думаю, что это можно сделать ?? - person Yash Tandon; 31.12.2020
comment
Я не думаю, что это еще поддерживается. Может быть, вы можете спросить об их репозитории (elasticsearch) на github. - person x4k3p; 31.12.2020
comment
Есть ли какой-либо другой способ разбить результаты агрегирования на страницы, так как будет сотни квалификационных документов, а также несколько таких подсчетов будут поддерживаться в дочерних документах, к которым условия будут применяться одновременно, я не думаю, что это решение будет осуществимо в соответствии с мои требования, можете ли вы предложить мне другой подход, при котором я могу внести некоторые изменения в свою схему и сохранить счетчики сеансов как таковые, чтобы я мог запрашивать их в соответствии с диапазоном дат, не выполняя для них какую-либо агрегацию. - person Yash Tandon; 31.12.2020
comment
Что ж, пожалуйста, задайте другой вопрос (я думаю, ответ на агрегацию соединений здесь) о том, как избежать этого варианта использования с агрегацией соединений для возможности использования прокрутки (и, пожалуйста, сошлитесь на этот вопрос/ответ). Одна вещь, которую я имею в виду, заключается в том, что вы можете постобрабатывать свои документы сеанса, обновляя связанный родитель, поэтому вы можете просто фильтровать этот пользовательский объект со счетом, но это может быть сложно. - person x4k3p; 31.12.2020
comment
Что касается этого варианта использования, вы ищете решение, связанное с потоковой передачей, рассмотрите возможность использования kafka, где у вас есть такие функции, как подсчет для временного окна или очень простой диапазон. - person x4k3p; 31.12.2020