将嵌套的数据存储在 Elastic Search 中以便在 Kibana 中进行分析是否更好?

Is it better to store data nested of flat in Elastic Search for analysis in Kibana?

我们决定将一些数据存储在 Elastic Search 中,以便在 Kibana 中进行分析。我们暂时依赖Kibana中的动态映射。

这样嵌套存储数据是不是更好:

project: {
  id: 1,
  path: [1],
  device: {
    id: 2,
    path: [1,2],
    accessory: {
      id: 3,
      path: [1,2,3]
    }
  }
}

或像这样发送更多规范化数据:

project: {
  id: 1,
  path: [1]
}

device: {
  id: 2,
  path: [1,2]
}

accessory: {
  id: 3,
  path: [1,2,3]
}

或者是否有第三种更好的方法来存储上述数据?

根据您示例的结构,嵌套应该更有帮助。

假设您的项目有不止一台设备,并且每台设备都有不止一个配件。您的结构可能如下所示:

{
    id: project1,
    ...,
    devices: [
      {
          id: dev1,
          name: device1,
          ...,
          accessories:[
              {
                  name: accessory1.1,
                  id: acc1.1,
                  ...
              },
              {
                  name: accessory1.2,
                  id: acc1.2,
                  ...
              }
          ]  
      },
      {
          id: dev2,
          name: device2,
          ...,
          accessories:[
              {
                  name: accessory2.1
                  id: acc2.1,
                  ...
              }
          ]  
      }
   ]
}

使用这种结构的优点:

  • 您的映射和设置将只关注项目的结构,而不是为每个项目、设备、附件定义多个设置和映射。

  • 此外,您将避免 "normalizing" 您的文档。规范化意味着项目、设备和附件将具有相同的字段并期望相同类型的值。

  • 如果需要,您可以在项目中添加或删除设备或附件,而不会影响多个文档。

  • 您可以在 Kibana 中创建仪表板,以根据特定字段分析您的数据。仪表板接受聚合,您可以让数据每 5 秒刷新一次。

我能找到的一些缺点:

  • 如果您是 ES 新手,一开始查询可能会有些混乱。

  • 如果您删除一个项目,包括设备和附件在内的全部信息也将被删除。小心点。

  • 聚合可能会对您的表现产生一些影响。但这与基础架构(HW、集群设计等)更相关。

最后,如果你想单独存储项目、设备和配件的信息,你可以为每个使用一个索引,但它们之间的关系可能不太容易保持,查询会变得非常复杂。

希望对您有所帮助! :D