![](/img/trans.png)
[英]How to perform complex query on aggregated fields in ElasticSearch
[英]How to count aggregated fields in Kibana Elasticsearch/opensearch query DSL?
我正在使用 Kibana 查看包含以下对象的 Opensearch 索引:
timestamp:"November 3rd 2022, 23:50:51.253" client_id:"61c9aebdd01d" event:"login"
timestamp:"November 3rd 2022, 23:51:11.553" client_id:"61c9aebdd01d" event:"error"
timestamp:"November 3rd 2022, 23:52:19.982" client_id:"287a5ef458db" event:"login"
timestamp:"November 3rd 2022, 23:59:35.840" client_id:"61c9aebdd01d" event:"login"
我想用事件“登录”计算唯一的 client_ids; 因此,使用上面的数据,计数将为 2。
我能够使用 AWS 的 Kibana 界面和查询 DSL 计算匹配“登录”的事件:
{
"query": {
"match": {
"event": "login"
}
}
}
...工作正常,并产生计数 3。
但是当我尝试根据各种文档构建聚合时,例如:
{
"size": 0,
"aggs": {
"client_count": {
"cardinality": {
"field": "client_id"
}
}
}
}
...我收到SearchError: Internal Server Error
。
我已经尝试过各种变体。 例如,这可以正常工作:
{
"size": 0,
"query": {
"match": {
"event": "login"
}
},
"aggs": {
"client_count": {
"cardinality": {
"field": "client_id",
"size": 0
}
}
}
}
...但是,它似乎并没有真正报告唯一 client_ids 的计数,它只是产生与上面第一个查询完全相同的结果(匹配所有“登录”事件)。
聚合类型“cardinality”、“terms”和“global”似乎都会产生相同的错误。
知道我应该使用什么语法吗?
PS:我查看了大约 30 个其他 Elasticsearch 查询问题,但似乎没有一个能回答这个问题
PPS:我不能使用类似的语法
GET /my_index_here/_search
{
...
您的查询看起来不错。 所以你的问题与你如何查询数据有关,而不是查询本身。
这是一步一步:
映射:
PUT test_cardinality
{
"mappings": {
"properties": {
"client_id": {
"type": "keyword"
},
"event": {
"type": "keyword"
}
}
}
}
文件:
POST test_cardinality/_doc
{
"client_id": "61c9aebdd01d",
"event": "login"
}
POST test_cardinality/_doc
{
"client_id": "287a5ef458db",
"event": "login"
}
询问
GET test_cardinality/_search
{
"size": 0,
"aggs": {
"client_count": {
"cardinality": {
"field": "client_id"
}
}
}
}
结果:
{
"took" : 11,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"client_count" : {
"value" : 2
}
}
}
答案是:
使用 Kibana 中的 Dev Tools 界面,而不是 Discover 界面,由于我不明白的原因,它似乎不适用于某些查询(也许结果对象不适用于默认可视化?)
完整查询代码:
GET /MY-INDEX-HERE/_search
{
"size": 0,
"query": {
"match": {
"event": "login"
}
},
"aggs": {
"client_count": {
"cardinality": {
"field": "client_id"
}
}
}
}
仅供参考,我最终使用这段代码来隔离特定时期(2019 年全年):
GET /MY-INDEX-HERE/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"range": {
"timestamp": {
"gte": "1546300800000",
"lt": "1577836800000"
}
}
},
{
"match": {
"event": "login"
}
}
]
}
},
"aggs": {
"client_count": {
"cardinality": {
"field": "client_id"
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.