Aggregation後のデータの最新、最古の日付を取得したい

aggregationで、集約結果取得と同時にそれぞれの最新、最古の日付を取得できるかご教示ください。

例)
以下のようなデータをclient_ipにてaggregationします

client_ip date
10.192.1.1 2021/10/1
10.192.1.1 2021/10/2
10.192.1.1 2021/10/3
10.192.1.2 2021/10/1
10.192.1.2 2021/10/2
10.192.1.2 2021/10/3
10.192.1.3 2021/10/1

aggregation後の結果は以下になります。
client_ip num
10.192.1.1 3
10.192.1.2 3
10.192.1.3 1

この時、さらにそれぞれのclient_ipについて、最も早い日付と遅い日付をaggregation結果として取得したいです。
例えば、10.192.1.1であれば、「2021/10/1」と「2021/10/3」をstart_date、end_dateとして取得したいです。このようなことは可能でしょうか?

client_ipのaggregaionの下に、dateのmin, maxのaggregationを置くのはどうでしょうか?

POST test1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "ip_addr": {
      "terms": {
        "field": "ip.keyword",
        "size": 10
      },
      "aggs": {
        "start_date" : {
          "min": {
            "field": "date"
          }
        },
        "end_date": {
          "max": {
            "field": "date"
          }
        }
      }
    }
  }
}

レスポンスイメージ
client_ipごと、それぞれで日付の最小、最大がセット取得できているかと思います。

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 7,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "ip_addr" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "10.192.1.1",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.2",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.3",
          "doc_count" : 1,
          "end_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        }
      ]
    }
  }
}

ご参考になれば幸いです

早々のご回答ありがとうございます。頂いた方法にて実現できそうです。
ちなみにもう一つご存じでしたら教えてください。aggregationした結果をキーにドキュメントを再検索し、データを取得したいです。実現可能でしょうか?

上記データで、client_ipでaggregationした結果、numが3以上のデータを取得したいです。1つのクエリの中で実現させたいのですが可能でしょうか?
<元データ>
10.192.1.1 2021/10/1
10.192.1.1 2021/10/2
10.192.1.1 2021/10/3
10.192.1.2 2021/10/1
10.192.1.2 2021/10/2
10.192.1.2 2021/10/3
10.192.1.3 2021/10/1

<client_ipでaggregationし、numが3以上のclient_ipのデータのみ取得>
10.192.1.1 2021/10/1
10.192.1.1 2021/10/2
10.192.1.1 2021/10/3
10.192.1.2 2021/10/1
10.192.1.2 2021/10/2
10.192.1.2 2021/10/3

bucket selectorではどうでしょうか?
下記の例のipaddr_bucket_filterの箇所を確認してみてください。

{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "ip_addr": {
      "terms": {
        "field": "ip.keyword",
        "size": 10
      },
      "aggs": {
        "ipaddr_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "ip_addr_count": "_count"
            },
            "script": "params.ip_addr_count >= 3"
          }
        },
        "start_date": {
          "min": {
            "field": "date"
          }
        },
        "end_date": {
          "max": {
            "field": "date"
          }
        }
      }
    }
  }
}

今回は、 >=3 を指定しているので、10.192.1.3に対する結果がフィルタリングされて出ていないことが確認できるかと思います。

実行結果の一部を転記します

"aggregations" : {
    "ip_addr" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "10.192.1.1",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        },
        {
          "key" : "10.192.1.2",
          "doc_count" : 3,
          "end_date" : {
            "value" : 1.6332192E12,
            "value_as_string" : "2021-10-03"
          },
          "start_date" : {
            "value" : 1.6330464E12,
            "value_as_string" : "2021-10-01"
          }
        }
      ]
    }
  }

公式だと、こちら

簡単に動作イメージをつかむ場合は、こちらが参考になるかと思います

すみません、表現が分かりづらかったです。
aggregationした結果、numが3以上のデータを取得し、それをキーにもう一度クエリしたいという意図でした。

■元データ

    "hits" : [
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/1"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/2"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/3"
        }
      }.
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.2",
          "date" : "2021/10/1"
        }
      }
    ]

これを、client_ipでaggregatuionし、numが3以上のもの(10.192.1.1)を条件に再検索し、データを抽出したいです。最終的に以下のような形で抽出したいです。

    "hits" : [
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/1"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/2"
        }
      },
      {
        "_index" : "poc_test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "client_ip" : "10.192.1.1",
          "date" : "2021/10/3"
        }
      }
    ]

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.