ElasticSearch / Painless:如何访问/汇总对象中的所有值

时间:2017-05-10 19:54:34

标签: java json elasticsearch kibana elasticsearch-painless

我一直在研究聚合,以及使用painless进行脚本编写,我无法弄清楚如何对对象中的所有值进行迭代/求和。

示例:

我的映射看起来像

"field1": {
  "properties": {
    "subfield1": {
      "type": "float"
    },
    "subfield2": {
      "type": "float"
    },
    "subfield3": {
      "type": "float"
    }
  }
}

我们假设我的数据如下:

{
  "field1" : {
    "subfield1": 50.0,
    "subfield2": 20.5,
    "subfield3": 30.5
  }
}

我想在50.0 + 20.5 + 30.5上执行范围查询,或者基本上以某种方式访问​​field1对象中的所有值。

聚合不允许我在字段中使用通配符。 我是looking at the code for LeafDocLookup(内部用于无痛),我发现相关方法已被禁用。

我设法编写了这样的脚本:

"query": {
  "script": {
    "script": {
      "inline": "return (doc['field1.subfield1'].value + doc['field1.subfield2'].value + doc['field1.subfield3'].value > 50);",
      "lang": "painless"
    }
  }
}

但这显然是次优的,并没有解决动态密钥的主要问题。

1 个答案:

答案 0 :(得分:4)

我终于明白了!它在弹性搜索中的doc对象中不可用,但 _ctx.source中可用。

因此,如果我使用HashMap

,我可以将对象作为Java params['_source']对象访问
"query": {
  "script": {
    "script": {
      "inline": "float sum = 0.0f; for (float v: params['_source'].values()) { sum += v; } return (sum > 50);",
      "lang": "painless"
    }
  }
}