elasticsearchelasticsearch-2.0elasticsearch-aggregation

Elasticsearch array value count aggregation


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.


Solution

  • 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"
                  }
                }
              }
            }
          }
        }
      }
    }