【问题标题】:How to count aggregated fields in Kibana Elasticsearch/opensearch query DSL?如何计算 Kibana Elasticsearch/opensearch 查询 DSL 中的聚合字段?
【发布时间】:2022-11-30 02:47:43
【问题描述】:

我正在使用 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”似乎都会产生相同的错误。

知道我应该使用什么语法吗?


P.S.:我查看了大约 30 个其他 Elasticsearch 查询问题,但似乎没有一个能回答这个问题

P.P.S:我不能使用类似的语法

GET /my_index_here/_search
{
...

因为它在 Kibana 界面中是不允许的:

【问题讨论】:

    标签: elasticsearch kibana elasticsearch-dsl opensearch


    【解决方案1】:

    您的查询看起来不错。所以你的问题与你如何查询数据有关,而不是查询本身。

    这是一步一步:

    映射:

    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 界面进行这些搜索...我在某些文档中看到过这种显式的“PUT/GET”语法,但 Kibana UI 不允许这样做.
    • 您可以将这些命令粘贴到 Kibana -> Dev Tools 上,Kibana UI 是什么意思?我不熟悉 AWS
    • 啊啊啊,我明白了——开发工具的控制台正在使用这些命令!我对“发现”查询接口与此 DSL 的关系感到困惑;它似乎只允许一个子集?
    • 在 discover 中,您只能在搜索栏和一些过滤器上使用 KQL。
    【解决方案2】:

    答案是:

    1. 使用 Kibana 中的 Dev Tools 界面,而不是 Discover 界面,由于我不明白的原因,它似乎不适用于某些查询(也许结果对象不适用于默认可视化?)

    2. 完整查询代码:

      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"
            }
          }
        }
      }
      

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多