elasticsearch Elasticsearch:选择多个不同的字段按id分组
我有以下格式的文档的ES索引,这些文档使用Fluentd解析器从日志中解析,并在ES中索引。记录格式: {“id”:“id1”,“field1”:“f1_val”,“message”:“XXXX”,“time”:“XXXX”} {“id”:“id1”,“field2”:“f2_val”,“message”:“XXXX”,“time”:“XXXX”} {“id”:“id1”,“field3”:“f3_val”,“field4”:“f4_val”,“message”:“XXXX”,“time”:“XXXX”} 我想按id字段分组,并将字段分组在一起,以便将数据可视化为Kibana仪表板中的表格,如下所示: {“id”:“id1”,“field1”:“f1_val”,“field2”:“f2_val”,“field3”:“f3_val”,“field4”:“f4_val”} 在基巴纳: Id Field1 Field2 Field3 Field4 id1 f1_val f2_val f3_val f4_val Id字段1字段2字段3字段4 id1 f1_val f2_val f3_val f4_val
elasticsearch Elasticsearch:选择多个不同的字段按id分组,
elasticsearch,kibana,elastic-stack,
elasticsearch,Kibana,Elastic Stack,我有以下格式的文档的ES索引,这些文档使用Fluentd解析器从日志中解析,并在ES中索引。记录格式: {“id”:“id1”,“field1”:“f1_val”,“message”:“XXXX”,“time”:“XXXX”} {“id”:“id1”,“field2”:“f2_val”,“message”:“XXXX”,“time”:“XXXX”} {“id”:“id1”,“field3”:“f3_val”,“field4”:“f4_val”,“message”:“XXXX”,“time”:“X
如何在Elasticsearch中按文档id分组并选择不同的字段值。谢谢 由于Elasticsearch不支持那么好的连接,在扩展Kibana中,我建议您在将文档放入索引之前,先在应用程序中连接文档。如果这不是一种可能性,我将按照以下建议进行转换:
{
"size": 0,
"aggs": {
"id_agg": {
"terms": {
"field": "id.keyword"
},
"aggs": {
"by_field1": {
"terms": {
"field": "field1.keyword"
}
},
"by_field2": {
"terms": {
"field": "field2.keyword"
}
},
"by_field3": {
"terms": {
"field": "field3.keyword"
}
}
}
}
}
}
使用此功能,我可以在仪表板中实现以下功能:
复制步骤:
PUT log_index
POST log_index/_doc/ {"id": "1", "field1": "The"}
POST log_index/_doc/ {"id": "1", "field2": "quick"}
POST log_index/_doc/ {"id": "1", "field3": "brown", "field4": "fox"}
POST log_index/_doc/ {"id": "2", "field1": "jumped"}
POST log_index/_doc/ {"id": "2", "field2": "over"}
POST log_index/_doc/ {"id": "2", "field3": "the"}
POST log_index/_doc/ {"id": "2", "field4": "lazy"}
PUT _transform/join_logs
{
"source": {
"index": [
"log_index"
]
},
"pivot": {
"group_by": {
"id.keyword": {
"terms": {
"field": "id.keyword"
}
}
},
"aggregations": {
"field1": {
"scripted_metric": {
"init_script": "state.docs = []",
"map_script": "state.docs.add(new HashMap(params['_source']))",
"combine_script": "for (t in state.docs) { if(t.get('field1') != null){ return t.get('field1')}} return null",
"reduce_script": "states"
}
},
"field2": {
"scripted_metric": {
"init_script": "state.docs = []",
"map_script": "state.docs.add(new HashMap(params['_source']))",
"combine_script": "for (t in state.docs) { if(t.get('field2') != null){ return t.get('field2')}} return null",
"reduce_script": "states"
}
},
"field3": {
"scripted_metric": {
"init_script": "state.docs = []",
"map_script": "state.docs.add(new HashMap(params['_source']))",
"combine_script": "for (t in state.docs) { if(t.get('field3') != null){ return t.get('field3')}} return null",
"reduce_script": "states"
}
},
"field4": {
"scripted_metric": {
"init_script": "state.docs = []",
"map_script": "state.docs.add(new HashMap(params['_source']))",
"combine_script": "for (t in state.docs) { if(t.get('field4') != null){ return t.get('field4')}} return null",
"reduce_script": "states"
}
}
}
},
"dest": {
"index": "joined_index"
}
}