Elasticsearch array value count aggregation
Asked Answered
E

1

6

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.

Expectorate answered 20/9, 2016 at 9:43 Comment(7)
elastic.co/guide/en/elasticsearch/reference/current/…Emptyheaded
@Emptyheaded i already looked at it. its not clear how to accomplish my requirement. When i give path as "attributes" i get exception. when i give "attributes.name", it get count as 0Expectorate
you have mapped attributes and its parent as nested right ?Emptyheaded
@Emptyheaded i just structure the data in code as an array and let elastic make the mapping automatically based on dataExpectorate
you'll have to make them both as nested type, predefined it before populating data.Emptyheaded
deleted the index, created new index and tried with the mapping given here (codebeautify.org/jsonviewer/cbc3d7e5). still doesnt workExpectorate
Let us continue this discussion in chat.Expectorate
E
5

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"
              }
            }
          }
        }
      }
    }
  }
}
Emptyheaded answered 20/9, 2016 at 11:8 Comment(1)
Just came across https://mcmap.net/q/1779402/-elasticsearch-group-and-aggregate-nested-values this answer, which is exactly what I was looking for and when i was here to tell you that, you have answered it exactly :)Expectorate

© 2022 - 2024 — McMap. All rights reserved.