Elasticsearch top_hits 聚合与最新文档
Elasticsearch top_hits aggregation vs latest document
我正在尝试获取最近 activity "connect" 的用户列表。理想情况下,我希望将其作为 Kibana 中的指标可视化或数据 table,分别显示最后连接的用户数量和用户列表。但是,我已经放弃了在 Kibana 中执行此操作的能力。我可以使用术语聚合后跟 top_hits 直接从 Elasticsearch 获得类似的东西,如下所示。但问题是,即使我按@timestamp 对 top_hits 进行排序,生成的文档也不是最新的。
{
"size" : 0,
"sort": { "@timestamp": {"order": "desc"} },
"aggs" : {
"by_user" : {
"terms" : {
"field" : "fields.username.keyword",
"size" : 1
},
"aggs": {
"last_message": {
"top_hits": {
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
],
"_source": {
"includes": ["fields.username.keyword", "@timestamp", "status"]
},
"size": 1
}
}
}
}
}
}
- 有没有办法直接在 Kibana 中执行此操作?
- 如何确保 top_hits 给我 最新的 结果,而不是 "most relevant"?
我想你想要的是 field collapsing,它比聚合更快。
类似这样的东西应该适用于您的用例:
GET my-index/_search {
"query": {
"match_all": { }
},
"collapse" : {
"field" : "fields.username.keyword"
},
"sort": [ {
"@timestamp": {
"order": "desc"
}
} ] }
我可能遗漏了一些东西,但我认为 Kibana 目前不支持它。
我正在尝试获取最近 activity "connect" 的用户列表。理想情况下,我希望将其作为 Kibana 中的指标可视化或数据 table,分别显示最后连接的用户数量和用户列表。但是,我已经放弃了在 Kibana 中执行此操作的能力。我可以使用术语聚合后跟 top_hits 直接从 Elasticsearch 获得类似的东西,如下所示。但问题是,即使我按@timestamp 对 top_hits 进行排序,生成的文档也不是最新的。
{
"size" : 0,
"sort": { "@timestamp": {"order": "desc"} },
"aggs" : {
"by_user" : {
"terms" : {
"field" : "fields.username.keyword",
"size" : 1
},
"aggs": {
"last_message": {
"top_hits": {
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
],
"_source": {
"includes": ["fields.username.keyword", "@timestamp", "status"]
},
"size": 1
}
}
}
}
}
}
- 有没有办法直接在 Kibana 中执行此操作?
- 如何确保 top_hits 给我 最新的 结果,而不是 "most relevant"?
我想你想要的是 field collapsing,它比聚合更快。
类似这样的东西应该适用于您的用例:
GET my-index/_search {
"query": {
"match_all": { }
},
"collapse" : {
"field" : "fields.username.keyword"
},
"sort": [ {
"@timestamp": {
"order": "desc"
}
} ] }
我可能遗漏了一些东西,但我认为 Kibana 目前不支持它。