在关系数据库上,我有一个由外键连接的表,在一个典型的一对多关系上。我想将此架构转换为ElasticSearch,因此我研究并找到了两个选项:nested和parent-child。我的最终目标是在Kibana 4中可视化这个数据集。
亲子似乎是最合适的,所以我将根据官方ES documentation和我在网上找到的一些例子来描述我所遵循的步骤。
curl -XPUT http://server:port/accident_struct -d '
{
"mappings" : {
"event" : {
},
"details": {
"_parent": {
"type": "event"
} ,
"properties" : {
}
}
}
}
';
这里我创建索引accident_struct,它包含两种类型(对应于两个关系表):事件和细节。
事件是父项,因此每个详细文档都有一个与之关联的事件。
然后我使用批量API上传文档。对于活动:
{"index":{"_index":"accident_struct","_type":"event","_id":"17f14c32-53ca-4671-b959-cf47e81cf55c"}}
{values here...}
详情:
{"index":{"_index":"accident_struct","_type":"details","_id": "1", "_parent": "039c7e18-a24f-402d-b2c8-e5d36b8ad220" }}
该事件对儿童一无所知,但每个孩子(细节)都需要设置其父母。在ES文档中,我看到使用" parent"设置父级,而在其他示例中,我使用" _parent"来查看它。我想知道什么是正确的选择(虽然在这一点上,没有一个适合我)。
请求已成功完成,我可以看到索引中包含的文档数对应于事件+类型的总和。
我还可以在ES上查询父母为父母的子女和子女。例如:
curl -XPOST host:port/accident_struct/details/_search?pretty -d '{
"query" : {
"has_parent" : {
"type" : "event",
"query" : {
"match_all" : {}
}
}
}
}'
在Kibana上设置索引后,我能够列出父和子的所有字段。但是,如果我去"发现"选项卡,仅列出父字段。
如果我取消选中一个显示"隐藏缺失字段"的框,子文档中的字段将显示为灰色,并显示错误消息(请参阅图像)
我做错了什么还是Kibana4不支持亲子?如果不支持,那么代表这种关系的最佳选择是什么呢?