在Elasticsearch查询中使用聚合函数

ovu*_*tin 6 querying aggregate-functions elasticsearch

我使用elasticsearch 0.90.10,我想查询中使用,比如聚合函数来执行它的搜索sum(),avg(),min().

假设我的数据是这样的

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

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

    {
        "name" : "Charlie",
        "grades" : [70, 80, 90, 100]
    }
]
Run Code Online (Sandbox Code Playgroud)

假设我需要取平均成绩大于75(即avg(grades) >= 75)的学生.如何使用DSL,过滤器或脚本在ES中编写这样的查询?

提前致谢.

mco*_*lin 4

发布的新ES 1.0.0.RC1可能有更好的方法来通过聚合来做到这一点,但这里有一个简单(而且非常详细)的脚本:

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;  "
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我测试的数据:

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]
}
Run Code Online (Sandbox Code Playgroud)