提问者:小点点

ElasticSearch/OpenSearch的最佳索引/文档结构


我是ElasticSearch/OpenSearch的新手,我正在努力找出为我的用例组织索引和文档结构的最佳方式。我想在仪表板上呈现我的应用程序中的一些统计信息,所以我计划直接将我的应用程序中的一些重要事件发送到ElasticSearch/OpenSearch。

我已经分析了应用程序并决定我将有以下事件(文档):

{
  "type": "api.request",
  "method": "{method-name}",
  "timestamp": "{timestamp}"
}

基于api. request事件,我想知道在特定时间范围内执行了多少API请求,例如RPS。

{
  "type": "page.rendered",
  "name": "{page-name}",
  "duration": "{render-duration}",
  "timestamp": "{timestamp}"
}

基于页面渲染事件,我想知道哪些页面被用户访问最多,页面渲染的速度有多快,例如,我想知道一些页面渲染速度是否很慢,这样我就可以优化它们的性能。

[
  {
    "type": "user.created",
    "userId": "{uuidv4}",
    "timestamp": "{timestamp}"
  },
  {
    "type": "user.invited",
    "userId": "{uuidv4}",
    "referrerId": "{uuidv4}",
    "timestamp": "{timestamp}"
  }
]

根据user. createuser.邀请事件,我想知道每天有多少用户被注册和邀请,有多少用户被邀请,有多少用户在没有邀请的情况下直接注册。

{
  "type": "user.invitation-failed",
  "userId": "{uuidv4}",
  "error": "{error-name}",
  "timestamp": "{timestamp}"
}

基于user. Invest-失败事件,我想知道是什么导致邀请失败(有各种原因),所以我想看看每个错误名称的百分比。

{
  "type": "user.photo-uploaded",
  "userId": "{uuidv4}",
  "photoId": "{uuidv4}",
  "timestamp": "{timestamp}"
}

基于user.photo上传的事件(和类似的),我想知道用户创建了多少对象(每天总计和每个用户)。

我应该如何组织索引来存储这些事件,以便我可以轻松地查询它们以提取我感兴趣的信息?我应该为每种事件类型创建一个单独的索引吗?我应该将一些事件组合在一起吗?或者我甚至应该为所有这些事件使用一个索引?我的文档结构是正确的还是应该将其更改为其他内容?

为了弄清楚这一点,我的推理应该是什么?


共1个答案

匿名用户

这个模式一般来说应该可以正常工作,您可以从将所有事件放在一个索引中开始。导入或创建一些假数据,索引它,然后尝试通过ES聚合获得所需的结果。随着数据集的增长,您将看到瓶颈并解决它们。

他们现在唯一需要注意的是确保您将用于聚合的所有字段存储为关键字。