Elasticsearch array value count aggregation

17,010

As you say the attribute field is nested. Try this, this will work

{
  "size": 0,
  "aggs": {
    "count": {
      "nested": {
        "path": "attributes"
      },
      "aggs": {
        "attribCount": {
          "terms": {
            "field": "attributes.name"
          }
        },
        "attribVal": {
          "terms": {
            "field": "attributes.name"
          },
          "aggs": {
            "attribval2": {
              "terms": {
                "field": "attributes.value"
              }
            }
          }
        }
      }
    }
  }
}
Share:
17,010
Sriram
Author by

Sriram

Updated on June 06, 2022

Comments

  • Sriram
    Sriram almost 2 years

    Sample documents:

    {
        "id": "62655",
        "attributes": [
            {
                "name": "genre",
                "value": "comedy"
            },
            {
                "name": "year",
                "value": "2016"
            }
        ]
    }
    
    {
        "id": "62656",
        "attributes": [
            {
                "name": "genre",
                "value": "horror"
            },
            {
                "name": "year",
                "value": "2016"
            }
        ]
    }
    
    {
        "id": "62657",
        "attributes": [
            {
                "name": "language",
                "value": "english"
            },
            {
                "name": "year",
                "value": "2015"
            }
        ]
    }
    

    Expected Output:

    {
        "hits" : {
            "total": 3,
            "hits": []
        },
        "aggregations": {
            "attribCount": {
                "language": 1,
                "genre": 2,
                "year": 3
            },
            "attribVals": {
                "language": {
                    "english": 1
                },
                "genre": {
                    "comedy": 1,
                    "horror": 1
                },
                "year": {
                    "2016": 2,
                    "2015": 1
                }
            }
        }
    }
    

    My Query:

    I could get the "attribCount" aggregation using below query. But I don't know how to get each attribute value count.

    {
        "query": {
            "filtered": {
                "query": {
                    "match_all": {}
                }
            }
        },
        "aggs": {
            "attribCount": {
                "terms": {
                    "field": "attributes.name",
                    "size": 0
                }
            }
        },
        "size": 0
    }
    

    When I aggregate using attributes.value, it gives overall count. But I need it listed under the name value as given in expected output.