java - Elasticsearch /无痛 : How do I access/sum all values in an object

标签 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"
    }
  }
}

但这显然不是最优的,并且没有解决动态 key 的主要问题。

最佳答案

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

因此,如果我使用 params['_source'],我可以将对象作为 Java HashMap 对象进行访问

"query": {
  "script": {
    "script": {
      "inline": "float sum = 0.0f; for (float v: params['_source'].values()) { sum += v; } return (sum > 50);",
      "lang": "painless"
    }
  }
}

关于java - Elasticsearch /无痛 : How do I access/sum all values in an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43901636/

相关文章:

java - 如何在JAVA中返回正确的JSON

javascript - 在 html 中加载 JSON 文件

java - 在java中链接两个椭圆

java - org.apache.commons.collections.map.ListOrderedMap

java - Json字符串部分反序列化为使用jackson嵌入另一个Json字符串的Java对象

elasticsearch - 聚合查询并返回elasticsearch中的所有字段

elasticsearch - 弹性-选择前5个匹配后进行过滤

elasticsearch - Elasticsearch 中索引的段数

java - 文件加载/保存资源管理器 Java

java - 通过 Maven 部署 Solr 到 Tomcat