gpt4 book ai didi

elasticsearch - 如何将脚本化度量标准中的Elasticsearch字段的类型从Long更改为Double?

转载 作者:行者123 更新时间:2023-12-03 01:52:37 24 4
gpt4 key购买 nike

在我的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com