如何将脚本度量中的elasticsearch字段的强制转换从Long更改为Double?

时间:2016-08-25 16:57:16

标签: elasticsearch groovy casting

在我的Elasticsearch查询的聚合器中,我试图使用恰好被转换为long类型的字段,在此示例中称为my_field

"test-metric": {
    "scripted_metric": {
        "init_script": "_agg['test'] = []",
        "map_script": "_agg['test'].add(doc.['my_field'].value));
    }
}

在某些情况下,'my_field'实际上包含一个double值,例如1.5。输出实际命中时,我可以看到正在输出1.5

我的期望是_agg['test']将包含1.5的相同值。但是,它会立即转换为类型org.elasticsearch.index.fielddata.ScriptDocValues$Longs,之后的所有计算都是错误的。

我已经尝试修改架构并且似乎“修复”了这个问题,但是在我当前的设置中,修改每个实例的架构并不是一个可行的解决方案。

相反,我正在寻找一种解决方案,它会在脚本指标中为我提供与匹配匹配中的一致值。

我尝试过这样的投射:

(org.elasticsearch.index.fielddata.ScriptDocValues$Doubles) doc.get('averageSessionsPerWeek')

但是,我收到了这个错误:

GroovyScriptExecutionException[GroovyCastException[Cannot cast object '[2]' with class 'org.elasticsearch.index.fielddata.ScriptDocValues$Longs' to class 'org.elasticsearch.index.fielddata.ScriptDocValues$Doubles' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: org.elasticsearch.index.fielddata.ScriptDocValues$Doubles(java.lang.Long)]];

似乎在创建doc对象时应用了强制转换。

这甚至可能吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

当您引用doc.['my_field'].value时:就像您在此处所做的那样,您正在访问doc值,这些值是Elasticsearch中反向索引中存储的值。由于此字段映射为long(整数)而不是浮点数,因此它实际上是Elasticsearch索引中的整数值。

  

输出实际命中时,我可以看到正在输出1.5。

当您检查命中时,您正在查看该文档的Fielddata,它是您索引到Elasticsearch的json对象(存储为字符串)。这仍然包含您索引的确切json字符串,并且不会显示从此初始值到doc值中索引的内容的任何强制。

当您想到Elasticsearch中的分析字符串字段时,这是最容易理解的。

{ "sentence": "The quick brown fox jumps over the lazy dog" }

在Fielddata中,这仍然是字符串"The quick brown fox jumps over the lazy dog",但在Elasticsearch的反向索引中,它将作为单独的标记存储: brown, dog, fox, jump, lazy, over, quick (实际指数值因使用的分析仪而异)

就doc值(反向索引)而言,你的原始值甚至不存在。