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

Treat multiple documents with a common id to be treated as one in kibana/elasticsearch

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

kibana 中是否有一种方法可以将这些多个文档视为一个文档?

例如我想找到一个字段的基数。每组具有相同 'cid' 的文档应该只计算一次。

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

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

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

这应该使 foo 项的基数为 2。

当我尝试使用 cid 作为存储桶创建可视化效果时,然后我想将其可视化为子存储桶的字段,我只是在 cids 上获得可视化效果,然后在另一个字段中获得可视化效果。

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

任何想法表示赞赏。

布雷特

请记住,Elasticsearch (ES) 为每个文档分配它自己的 _id,因此即使您将 cid 视为文档的唯一标识符,ES 也不知道它并会索引您在问题中给出的示例有 3 个不同的文档。您可以更改 ES 为文档生成索引的方式,并使其使用 cid 字段的值。如果 ES 使用 cid 值作为索引,您将只有 2 个文档被索引。请参阅 this question 了解如何让 ES 使用您的 cid 字段作为标识符。

您的另一个选择是让 Kibana 在您按 f 项拆分成桶时计算 cid 字段的唯一值(这将是您的指标)。如果你玩过 Kibana UI,你应该可以完成同样的任务

oldbam 的回答在某种程度上引导我走上了正确的道路,但我的问题含糊不清,无助于提供精确性。

最后我使用的答案是通过 logstash 更新插入而不是插入,同时还使用我的 cid 作为 _id。

所以在 elasticsearch 输出中你必须做:

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

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