在我的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
对象时应用了强制转换。这有可能吗?
谢谢!
最佳答案
当您引用doc.['my_field'].value
时:就像您在这里所做的那样,您正在访问doc值,这些值是存储在Elasticsearch的反向索引中的值。因为此字段映射为长(整数)而不是浮点数,所以它实际上是Elasticsearch索引中的整数值。
When outputting the actual hits, I can see that 1.5 is being output.
当检查命中时,您正在查看该文档的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的反向索引中,它将作为单独的 token 存储:
brown,
dog,
fox,
jump,
lazy,
over,
quick
(实际索引值会根据所使用的分析仪而有所不同)就doc值(反向索引)而言,您的原始值甚至不存在。
关于elasticsearch - 如何将脚本化度量标准中的Elasticsearch字段的类型从Long更改为Double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150876/