当前位置: 首页 > 知识库问答 >
问题:

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

邢皓
2023-03-14

我有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中选择不同的字段值。谢谢!

共有2个答案

谷梁振
2023-03-14

由于Elasticsearch不支持那么好的连接,在扩展Kibana中,我建议您在将文档放入索引之前将文档连接到应用程序中。如果不可能,我会按照以下建议进行转换:

https://discuss.elastic.co/t/combine-multiple-document-into-one-document-with-limited-fields-merging-of-documents/231758

使用这个,我可以在我的仪表板中实现这样的东西:结果图像

复制步骤:

  1. 创建日志索引
    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的文档中只出现一次。不知道如果字段在文档之间重叠会发生什么。

郑俊弼
2023-03-14
{
    "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),要么返回了无效的结果 您知道如何实现此查询吗? 问题答案: 也许您必须使用聚合函数或用于列