在Elasticsearch中存储基于用户的事件

时间:2019-03-21 19:52:26

标签: 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”的用户ID。 使用嵌套文档,效果很好。但是亲子,我无法同时对亲子进行搜索。

1 个答案:

答案 0 :(得分: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"
              }
            }
          }
        }
      ]
    }
  }
}