2 분 소요

설명

  • 배열 형태의 데이터에 대해 개별 query 및 aggregations을 하기 위한 필드 타입


테스트

  • 데이터
    PUT index_1/_doc/1
    {
      "array_1": [
        {
          "name": "name 1",
          "date": "2021/01/01 01:00:00",
          "array_2": [
            {
              "field_1": "1",
              "field_2": 1
            },
            {
              "field_1": "2",
              "field_2": 2
            }
          ]
        }
      ]
    }
  • Nested를 지정하지 않은 경우
    • request
    GET index_1/_search
    {
      "query": {
        "range": {
          "array_1.date": {
            "gte": "2021/01/01 01:00:00",
            "lt": "2021/01/01 01:05:00",
            "format": "yyyy/MM/dd HH:mm:ss"
          }
        }
      },
      "size": 0,
      "aggs": {
        "name": {
          "terms": {
            "field": "array_1.name.keyword"
          },
          "aggs": {
            "array_2-field_1": {
              "terms": {
                "field": "array_1.array_2.field_1.keyword"
              },
              "aggs": {
                "array_2-field_2": {
                  "stats": {
                    "field": "array_1.array_2.field_2"
                  }
                }
              }
            }
          }
        }
      }
    }
  • response
    • terms를 지정하였음에도 모든 field_2에 대해 연산 수행
{
  "took": 3,
  "timed_out": false,
  "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 },
  "hits":
    {
      "total": { "value": 1, "relation": "eq" },
      "max_score": null,
      "hits": [],
    },
  "aggregations":
    {
      "name":
        {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets":
            [
              {
                "key": "name 1",
                "doc_count": 1,
                "array_2-field_1":
                  {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets":
                      [
                        {
                          "key": "1",
                          "doc_count": 1,
                          "array_2-field_2":
                            {
                              "count": 2,
                              "min": 1.0,
                              "max": 2.0,
                              "avg": 1.5,
                              "sum": 3.0,
                            },
                        },
                        {
                          "key": "2",
                          "doc_count": 1,
                          "array_2-field_2":
                            {
                              "count": 2,
                              "min": 1.0,
                              "max": 2.0,
                              "avg": 1.5,
                              "sum": 3.0,
                            },
                        },
                      ],
                  },
              },
            ],
        },
    },
}
  • Nested를 지정한 경우
    • 정적 매핑
    PUT index_1
    {
      "mappings": {
        "properties": {
          "array_1": {
            "type": "nested",
            "properties": {
              "array_2": {
                "type": "nested",
                "properties": {
                  "field_1": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "field_2": {
                    "type": "long"
                  }
                }
              },
              "date": {
                "type": "date",
                "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
              },
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }
  • request
    GET index_1/_search
    {
      "query": {
        "nested": {
          "path": "array_1",
          "query": {
            "range": {
              "array_1.date": {
                "gte": "2021/01/01 01:00:00",
                "lt": "2021/01/01 01:05:00",
                "format": "yyyy/MM/dd HH:mm:ss"
              }
            }
          }
        }
      },
      "size": 0,
      "aggs": {
        "nested-array_1": {
          "nested": {
            "path": "array_1"
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "array_1.name.keyword"
              },
              "aggs": {
                "nested-array_2": {
                  "nested": {
                    "path": "array_1.array_2"
                  },
                  "aggs": {
                    "array_2-field_1": {
                      "terms": {
                        "field": "array_1.array_2.field_1.keyword"
                      },
                      "aggs": {
                        "array_1-field_2": {
                          "stats": {
                            "field": "array_1.array_2.field_2"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  • response
{
  "took": 2,
  "timed_out": false,
  "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 },
  "hits":
    {
      "total": { "value": 1, "relation": "eq" },
      "max_score": null,
      "hits": [],
    },
  "aggregations":
    {
      "nested-array_1":
        {
          "doc_count": 1,
          "name":
            {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets":
                [
                  {
                    "key": "name 1",
                    "doc_count": 1,
                    "nested-array_2":
                      {
                        "doc_count": 2,
                        "array_2-field_1":
                          {
                            "doc_count_error_upper_bound": 0,
                            "sum_other_doc_count": 0,
                            "buckets":
                              [
                                {
                                  "key": "1",
                                  "doc_count": 1,
                                  "array_1-field_2":
                                    {
                                      "count": 1,
                                      "min": 1.0,
                                      "max": 1.0,
                                      "avg": 1.0,
                                      "sum": 1.0,
                                    },
                                },
                                {
                                  "key": "2",
                                  "doc_count": 1,
                                  "array_1-field_2":
                                    {
                                      "count": 1,
                                      "min": 2.0,
                                      "max": 2.0,
                                      "avg": 2.0,
                                      "sum": 2.0,
                                    },
                                },
                              ],
                          },
                      },
                  },
                ],
            },
        },
    },
}