Joe - Check out my books
Joe - Check out my books

Reputation: 16915

Terms aggregation with nested wildcard path

Given the following nested object of nested objects

{
  [...]
  "nested_parent":{
    "nested_child_1":{
      "classifier":"one"
    },
    "nested_child_2":{
      "classifier":"two"
    },
    "nested_child_3":{
      "classifier":"two"
    },
    "nested_child_4":{
      "classifier":"five"
    },
    "nested_child_5":{
      "classifier":"six"
    }
  [...]
}

I'm wanting to aggregate on the wildcard-ish field nested_parent.*.classifier, along the lines of

{
  "size": 0,
  "aggs": {
    "termsAgg": {
      "nested": {
        "path": "nested_parent.*"
      },
      "aggs": {
        "termsAgg": {
          "terms": {
            "size": 1000,
            "field": "nested_parent.*.classifier"
          }
        }
      }
    }
  }
}

which does not seem to work -- possibly because the path and field are not defined clearly enough.

How can I aggregate on nested objects with dynamically created nested mappings which share most of their properties, including the classifier on which I intend to terms-aggregate?

Upvotes: 4

Views: 497

Answers (1)

Paulo
Paulo

Reputation: 10346

Tdlr;

A bit late to the party. I would suggest a different approach as I don't see a possible solution using wildcards.

My solution would involve using the copy_to to create a field that you will be able to access using aggregation.

Solution

The idea is to create a field that will store the values of all your classifiers. Which you can be doing aggregation on.

PUT /54198251/
{
  "mappings": {
    "properties": {
      "classifiers": {
        "type": "keyword"
      },
      "parent": {
        "type": "nested",
        "properties": {
          "child": {
            "type": "nested",
            "properties": {
              "classifier": {
                "type": "keyword",
                "copy_to": "classifiers"
              }
            }
          },
          "child2": {
            "type": "nested",
            "properties": {
              "classifier": {
                "type": "keyword",
                "copy_to": "classifiers"
              }
            }
          }
        }
      }
    }
  }
}

POST /54198251/_doc
{
  "parent": {
    "child": {
      "classifier": "c1"
    },
    "child2": {
      "classifier": "c2"
    }
  }
}

GET /54198251/_search
{
  "aggs": {
    "classifiers": {
      "terms": {
        "field": "classifiers",
        "size": 10
      }
    }
  }
}

Will give you:

  "aggregations": {
    "classifiers": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "c1",
          "doc_count": 1
        },
        {
          "key": "c2",
          "doc_count": 1
        }
      ]
    }
  }

Upvotes: 1

Related Questions