【问题标题】:Using aggregation functions in Elasticsearch queries在 Elasticsearch 查询中使用聚合函数
【发布时间】:2014-02-10 20:27:57
【问题描述】:

我正在使用 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)。如何在 ES 中使用 DSL、过滤器或脚本编写这样的查询?

提前致谢。

【问题讨论】:

    标签: elasticsearch aggregate-functions querying


    【解决方案1】:

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

    【讨论】:

    • 它应该,正如我原来的评论所说,这是现有的脚本做事方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2022-01-18
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多