6

我正在使用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]
    }
]

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

提前致谢。

4

1 回答 1

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

我测试的数据:

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]
}
于 2014-01-21T15:06:20.773 回答