elasticsearch - 在 Elasticsearch 查询中使用聚合函数

标签 elasticsearch aggregate-functions querying

我正在使用 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 中编写这样的查询?

提前致谢。

最佳答案

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]
}

关于elasticsearch - 在 Elasticsearch 查询中使用聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254837/

相关文章:

sql - 行间时间差之和

mysql - 按用户聚合时间戳月份

mysql - 获取给定用户的权限

mysql - 在我的 sql 查询中收到 'users_personals.user_id' 中的未知列 'where clause'

PHP 和 MySQL : Order by most recent date and limit 10

PhP(Codeigniter)在foreach循环之前合并查询结果

php - PHP + Elasticsearch-从Elastic2到Elastic6

elasticsearch - 如何在 Elasticsearch 中针对给定的搜索词提升特定文档?

php - 过滤 Elasticsearch GET请求

arrays - 如何在elasticsearch中按数组元素搜索?