我有ES索引,其中包含以下格式的文档,这些文档使用Fluentd解析器从日志中解析,并在ES中索引。记录格式:
{"id":"id1","field 1":"f1_val","消息":"XXXX","时间":"XXXX"}
{"id":"id1","field 2":"f2_val","消息":"XXXX","时间":"XXXX"}
{"id":"id1","field 3":"f3_val","field 4":"f4_val","消息":"XXXX","时间":"XXXX"}
我想按id字段分组,并将字段分组在一起,以便将数据可视化为Kibana仪表板中的表格,如下所示:
{"id":"id1","field 1":"f1_val","field 2":"f2_val","field 3":"f3_val","field 4":"f4_val"}
在Kibana:
Id Field1 Field2 Field3 Field4 id1 f1_val f2_val f3_val f4_val
如何按文档对id进行分组并在Elasticsearch中选择不同的字段值。谢谢!
由于Elasticsearch不支持那么好的连接,在扩展Kibana中,我建议您在将文档放入索引之前将文档连接到应用程序中。如果不可能,我会按照以下建议进行转换:
https://discuss.elastic.co/t/combine-multiple-document-into-one-document-with-limited-fields-merging-of-documents/231758
使用这个,我可以在我的仪表板中实现这样的东西:结果图像
复制步骤:
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"
}
}
我的假设是,这些字段在每个具有指定id的文档中只出现一次。不知道如果字段在文档之间重叠会发生什么。
{
"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和值作为命名列,因此它看起来像这样: 任何帮助将非常感激!! 问题答案: 您可以使用以下简单解决方案: 为了安全起见,我创建了join ,因为我不知道id是否可以包含 缺少的 字段,在这种情况下,它们将显示在我们的派生列中。 SQL提琴演示
通过id选择一行应该是一件简单的事情,但我在如何将其映射到对象时遇到了一些麻烦。 我发现这个问题是寻找同样的东西,但给出的答案对我不起作用。 目前我有这是工作,但它似乎没有那么优雅,因为它应该。 我觉得获取一个列表,然后使用是很大的,而且没有必要。我一定是漏掉了什么。
问题内容: 我只想对elasticsearch执行以下请求。 在SQL中: 我只有 : 提前致谢 :) 问题答案: 您快到了,您只需要向查询添加汇总
问题内容: 我想根据URL字符串选择一些ID,但对于我的代码,它仅显示第一个。如果我写手册的ID是伟大的。 我有这样的网址http://www.mydomain.com/myfile.php?theurl=1,2,3,4,5(ids) 现在在myfile.php中,我有sql连接,并且: 如果我使用这个: 我得到正确的结果。现在,如果我使用下面的代码,它将无法正常工作: 有什么建议? 问题答案:
问题内容: 我发现的唯一接近的事情是:Elasticsearch中的多个分组方式 基本上,我试图获得与以下查询等效的ES : 年龄和性别本身很容易获得: 这使: 但是现在我需要这样的东西: 请注意,这是针对年龄范围的“映射”,因此它们实际上表示的是:)而不是数字。例如,性别[1](“男性”)细分为[246]的年龄范围[0](“18岁以下”)。 问题答案: 由于您只有2个字段,因此一种简单的方法是使
问题内容: 我正在尝试查询sybase服务器,以获取我们为测试目的而持有的不同类型数据的示例。 我有一张看起来像下面的表格(摘要) 正如我提到的那样,我想要每种类型的示例,因此对于上表,它需要一个类似的结果集(实际上,我只想要ID): 我尝试了以下查询的多种组合,但它们要么是无效的SQL(对于sybase),要么返回了无效的结果 您知道如何实现此查询吗? 问题答案: 也许您必须使用聚合函数或用于列