Хранение пользовательских событий в elasticsearch

#elasticsearch

#elasticsearch

Вопрос:

Мы создаем хранилище данных о событиях поверх elasticsearch. Наша цель — предоставить аналитику в реальном времени с расширенной сегментацией поверх пользователей и событий. Наши объекты являются

События пользователей или посетителей (которые выполняются пользователями, которых будет более 100-1000)

Пример:

 {
"first_name": "John",
"email": "john@es.com",
"country": "US",
"user_id": 100
}

{
"event_name": "Add To Cart",
"user_id": 100,
"product_name": "IPhone X"
}
  

Я попробовал 2 варианта

Вложенные документы, проблема заключается в том, что пользовательские атрибуты не будут часто изменяться. Но события будут выполняться очень часто. Допустим, пользователь выполнит более 1000 событий, поэтому один и тот же документ будет обновляться более 1000 раз.

Отношения «родитель-потомок», не удовлетворяющие сегментации

Возможные запросы:

Дайте мне идентификаторы пользователя, который находится в США и выполнил «Добавить в корзину», а название продукта «iPhone X» с вложенными документами, все работает хорошо. Но родитель-потомок, я не смог выполнить поиск в parent amp; child одновременно.

Ответ №1:

Не уверен, каково ваше отображение и как вы создаете эти документы, но это будет выглядеть примерно так:

 PUT events

PUT events/_doc/_mapping
{
  "properties": {
    "relation": {
      "type": "join",
      "relations": {
        "owner": "related_event"
      }
    }
  }
}

PUT events/_doc/100
{
  "first_name": "John",
  "email": "john@es.com",
  "country": "US",
  "user_id": 100,
  "relation": {
    "name": "owner"
  }
}

PUT events/_doc/2034?routing=100
{
  "event_name": "Add To Cart",
  "user_id": 100,
  "product_name": "IPhone X",
  "relation": {
    "name": "related_event",
    "parent": 100
  }
}
  

И вот ваш запрос:

 GET events/_search
{
  "_source": "id",
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "country": "US"
          }
        },
        {
          "has_child": {
            "type": "related_event",
            "query": {
              "match": {
                "product_name": "IPhone X"
              }
            }
          }
        }
      ]
    }
  }
}