将具有公共ID的多个文档视为kibana / elasticsearch中的一个

时间:2016-02-10 16:41:43

标签: elasticsearch logging logstash kibana nosql

我存储在elasticsearch中的文档如果与同一事件有关,则会被赋予一个共同的id(cid)。

在kibana中有没有办法将这些多个文件视为单个文件?

例如,我想找到一个字段的基数。每组文件都有相同的“cid”字样。应该算一次。

{
   "f": "foo",
   "cid": 1,
   ...
}

{
   "f": "foo",
   "cid": 1,
   ...
}

{
   "f": "foo",
   "cid": 2,
   ...
}

这应该将术语foo的基数设为2.

当我尝试使用cid作为存储桶创建可视化时,那么我想要将其视为子存储桶的字段,我只是在cid上获得可视化,然后在其他字段中获得可视化。

我不确定kibana是否适合这种情况,或者我最好将索引传回脚本以将这些文档合并为一个(看起来有点混乱)。

任何想法都赞赏。

布雷特

2 个答案:

答案 0 :(得分:0)

请记住,Elasticsearch(ES)会为每个文档分配自己的_id,因此,即使您将cid视为文档的唯一标识符,ES也不知道它并将3个不同的索引您在问题中提供的示例的文档。您可以更改ES为文档生成索引的方式,并使其使用cid字段的值。如果ES一直使用cid值作为索引,那么您只能索引2个文档。请参阅https://angularu.com/VideoSession/2015sf/angular-2-server-rendering以了解如何让ES使用您的cid字段作为标识符。

另一个选择是,当您按cid项分割为存储桶时,让Kibana计算f字段的唯一值(这将是您的指标)。如果您使用Kibana UI,您应该能够完成相同的任务

答案 1 :(得分:0)

oldbam的回答有点引导我走正确的道路,但我的问题含糊不清,无助于精确度。

最后,我使用的答案是通过logstash而不是insert进行upsert,同时使用我的cid作为_id。

所以在弹性搜索输出中你必须这样做:

doc_as_upsert => true # Make sure we use the doc as the values to upsert
action => "update" # update if possible instead of overwriting 
document_id => "%{cid}" set the _id to cid

希望能帮助其他人解决这个问题。