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对象中的所有值。

聚合不允许我在字段中使用通配符。 我正在查看LeafDocLookup的代码 (内部用于无痛),我看到相关方法被禁用。

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

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

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

我终于想通了! 它在_ctx.source中的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" } } } 
Interesting Posts