ElasticSearch/Painless: 如何 access/sum 对象中的所有值
ElasticSearch/Painless: How do I access/sum all values in an object
我一直在研究聚合和使用 painless
编写脚本,但我无法弄清楚如何 iterate/sum 对象中的所有值。
示例:
我的映射看起来像
"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"
}
}
}
但这显然不是最优的,并且没有解决动态密钥的主要问题。
我终于明白了!它在 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"
}
}
}
我一直在研究聚合和使用 painless
编写脚本,但我无法弄清楚如何 iterate/sum 对象中的所有值。
示例:
我的映射看起来像
"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"
}
}
}
但这显然不是最优的,并且没有解决动态密钥的主要问题。
我终于明白了!它在 elasticsearch 中的 doc
对象中不可用,但 是 在 _ctx.source
.
因此,如果我使用 params['_source']
HashMap
对象访问
"query": {
"script": {
"script": {
"inline": "float sum = 0.0f; for (float v: params['_source'].values()) { sum += v; } return (sum > 50);",
"lang": "painless"
}
}
}