elasticsearch 在Kibana中存储弹性搜索中的扁平嵌套数据以进行分析是否更好?
我们决定在弹性搜索中存储一些数据,以便在Kibana中进行分析。目前,我们依靠Kibana中的动态映射 以这种嵌套方式存储数据是否更好:elasticsearch 在Kibana中存储弹性搜索中的扁平嵌套数据以进行分析是否更好?,elasticsearch,kibana,elasticsearch,Kibana,我们决定在弹性搜索中存储一些数据,以便在Kibana中进行分析。目前,我们依靠Kibana中的动态映射 以这种嵌套方式存储数据是否更好: project: { id: 1, path: [1], device: { id: 2, path: [1,2], accessory: { id: 3, path: [1,2,3] } } } 或者发送更规范化的数据,如下所示: project: { id: 1, path:
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,
...
}
]
}
]
}
或者有第三种更好的方法来存储上述数据吗?根据示例的结构,嵌套应该更有帮助 假设您的项目有多个设备,每个设备都有多个附件。您的结构可能如下所示:
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,
...
}
]
}
]
}
使用这种结构的优点是:
- 您的映射和设置将只关注项目的结构,而不是为每个项目、设备和附件定义多个设置和映射
- 另外,您将避免“规范化”您的文档。规范化意味着项目、设备和附件将具有相同的字段,并期望具有相同类型的值
- 如果需要,您可以在项目中添加或删除设备或附件,而不会影响多个文档
- 您可以在Kibana中创建仪表板,根据特定字段分析数据。仪表板接受聚合,您可以每5秒刷新一次数据
- 如果您是ES新手,查询一开始可能会有点混乱
- 如果删除项目,整个信息(包括设备和附件)也将被删除。小心点
- 聚合可能会对您的性能产生一些影响。但这更多地与基础设施(硬件、集群设计等)相关