Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using aggregation functions in Elasticsearch queries

I'm using elasticsearch 0.90.10 and I want to perform a search on it using a query with aggregation functions like sum(), avg(), min().

Suppose my data is something like that

[
    {
        "name" : "Alice",
        "grades" : [40, 50, 60, 70]
    },

    {
        "name" : "Bob",
        "grades" : [10, 20, 30, 40]
    }, 

    {
        "name" : "Charlie",
        "grades" : [70, 80, 90, 100]
    }
]

Let's say I need to fetch students with average grade greater than 75 (i.e. avg(grades) >= 75). How can I wrote such a query in ES using DSL, filters or scripting?

Thanks in advance.

like image 247
ovunccetin Avatar asked Jan 21 '14 10:01

ovunccetin


1 Answers

The new ES 1.0.0.RC1 that is out might have better ways to do this with aggregations BUT here is a simple (and very verbose) script that works:

POST /test_one/grades/_search
{
    "query" : {
        "match_all": {}
    },
    "filter" : {
        "script" : {
            "script" : " sum=0; foreach( grade : doc['grades'].values) { sum = sum + grade }; avg = sum/doc['grades'].values.length; avg > 25;  "
        }
    }
}

Data I tested with:

POST /test_one/grades
{
    "name": "chicken",
    "grades": [35,55,65]
}

POST /test_one/grades
{
    "name": "pork",
    "grades": [15,35,45]
}

POST /test_one/grades
{
    "name": "kale",
    "grades": [5,10,20]
}
like image 67
mconlin Avatar answered Oct 16 '22 22:10

mconlin