ElasticSearch的加权平均值

时间:2016-10-14 07:21:24

标签: javascript math elasticsearch stat

我是ElasticSearch的新手,我试图在我的索引中加权平均值。

我的数据如下:

data = [{"id": 344,"q28": 1},{"id": 344,"q28": 1},{"id": 344,"q28": 2}, ...]

" q28":可以等于1,2,3或4

JavaScript中的示例:

var data = [{"id": 344,"q28": 1},{"id": 344,"q28": 1},{"id": 344,"q28": 2}]
function calcWeightAverage(res) {
    var score = 0
    for (var i in res) {
        if (res[i].q28 == 1)
            score += 100
        else if (res[i].q28 == 2)
            score += 50
        else if (res[i].q28 == 3)
            score += 25
        else if (res[i].q28 == 4)
            score += 0
    }
    return score / res.length 
}

console.log(calcWeightAverage(data)) // output 83.333...

你能帮我找到一个直接在ElasticSearch中计算q28加权平均值的查询吗?

谢谢!

更新1

我关闭,请参阅:" https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html"

为了测试它,我在config / scripts / my_script.groovy

中创建了一个文件
1 + my_var

然后你必须重新启动ElasticSearch并进行此查询:

GET /_search
{
  "script_fields": {
    "my_field": {
      "script": {
        "file": "my_script",
        "params": {
          "my_var": 2
        }
      }
    }
  }
}

它正在工作,现在我必须处理脚本。 如何在我的所有数据中循环以执行类似我的javascript函数?

1 个答案:

答案 0 :(得分:2)

只是为了帮助你缩短平均值的Javascript部分。



function calcWeightAverage(res) {
    return res.reduce(function (r, a) {
        return r + ({ 1: 100, 2: 50, 3: 25, 4: 0 }[a.q28] || 0);
    }, 0) / res.length;
}
   
var data = [{ id: 344, q28: 1 }, { id: 344, q28: 1 }, { id: 344, q28: 2 }];

console.log(calcWeightAverage(data));