Using aggregation functions in Elasticsearch queries

I am using elasticsearch 0.90.10 and I want to search for it using a query with aggregation functions like sum() , avg() , min() .

Suppose my data is something like this

 [ { "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 students with a middle class greater than 75 (i.e. avg(grades) >= 75 ). How can I write such a request in ES using DSL, filters or scripts?

Thanks in advance.

+6
source share
1 answer

The new ES 1.0.0.RC1 , which is missing, may have better ways to do this using 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; " } } } 

The 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] } 
+4
source

All Articles