elasticsearch Elasticsearch:选择多个不同的字段按id分组,elasticsearch,kibana,elastic-stack,elasticsearch,Kibana,Elastic Stack" /> elasticsearch Elasticsearch:选择多个不同的字段按id分组,elasticsearch,kibana,elastic-stack,elasticsearch,Kibana,Elastic Stack" />

elasticsearch Elasticsearch:选择多个不同的字段按id分组

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

我有以下格式的文档的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中按文档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"
                    }
                }
            }
        }
    }
}

使用此功能,我可以在仪表板中实现以下功能:

复制步骤:

  • 创建日志索引
  • 添加一些数据
  • 将日志索引转换为连接索引(我非常确定脚本化的度量可以写得更好。这是第一件有效的事情):
  • 运行转换
  • 为连接索引创建索引模式
  • 在发现和创建表中打开。保存并将其添加到仪表板
  • 我这样做的假设是,字段在每个具有指定id的文档中只出现一次。不知道如果字段在文档之间重叠会发生什么

        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"
          }
        }