Elasticsearch 术语聚合和查询

Elasticsearch terms aggregation and querying

我有两种类型的日志消息:

Jul 23 09:24:16 rrr mrr-core[222]: Aweg3AOMTs_1563866656871111.mt processMTMessage() #12798 realtime: 5.684 ms

Jul 23 09:24:18 rrr mrr-core[2222]: Aweg3AOMTs_1563866656871111.0.dn processDN() #7750 realtime: 1.382 ms

第一条消息是一种已发送消息,第二条消息是确认消息已送达的消息。

它们的区别是我把"id"分开的后缀可以查询了

这些消息被解析并以下列格式存储在 elasticsearch 中:

messageId: Aweg3AOMTs_1563866656871111.0.dn
text: Aweg3AOMTs
num1: 1563866656871111
num2: 0
suffix: mt/dn

我想知道哪些消息已成功发送,哪些未成功发送。我是 elasticsearch 的初学者,所以我真的很挣扎。

我目前正在尝试术语聚合,但我所能实现的就是这段代码:

GET /my_index3/_search
{
  "size": 0,
  "aggs": {
    "num1": {
      "terms": {
        "field": "messageId.keyword",
        "include": ".*mt*."
      }
    }
  } 
}

显示已发送的消息。我不知道如何在那里添加一些过滤器或子句,以便只显示同时具有 mt 和 dn 后缀的消息。

如果有人有想法,我将非常感激:))

运行 messageId.keyword 上的术语聚合不是很好,因为每条消息都不同('Aweg3AOMTs_1563866656871111.0.dn' 与 'Aweg3AOMTs_1563866656871111.mt' 不同)。

从文档结构来看,我认为您最好 运行 num1 上的术语聚合,这是 .mt 和 .dn 消息的公共部分。该聚合将为您提供每个唯一 num1 的消息计数。因此,对于每条收到请求和响应的消息,计数为 2,只有请求的消息计数为 1。

如果你还想看到数字本身,你可以在里面添加一个嵌套聚合,比如大小为 1 的 top-hits 聚合,它会在里面显示 num1 字段:

GET /my_index3/_search {
"size": 0,
"aggs": {
    "num1": {
        "terms": {
            "field": "num1",
            "order": {
                "_count": "desc"
            },
            "aggs": {
                "count_of_distinct_suffix": {
                    "cardinality": {
                        "field": "suffix"
                    },
                    "aggs": {
                        "filter_count_is_2": {
                            "bucket_selector": {
                                "buckets_path": {
                                    "the_doc_count": "_count"
                                },
                                "script": "the_doc_count == 2"
                            }
                        }
                    }
                }
            }
          }
       }
    }
}