在我的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
对象时应用了强制转换。
这甚至可能吗?
谢谢!
答案 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值(反向索引)而言,你的原始值甚至不存在。