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

标签 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对象时应用了强制转换。

这有可能吗?

谢谢!

最佳答案

当您引用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/

相关文章:

java - 如果从数组中复制最终变量,为什么 Java 需要对它进行显式强制转换?

elasticsearch - 如何根据ElasticSearch字段中子字符串出现的次数进行评分

database - 如何 “join” 2索引并在ElasticSearch中搜索?

java - Groovy 控制台不输出旧值

java - 如何使用私有(private)属性(property)创建 Spock Spy

c# - 对象列表转换的最佳方式是什么

php - Elasticsearch PHP 客户端抛出异常 "No alive nodes found in your cluster"

elasticsearch - 使用Logstash自动解析日志字段

groovy - 如何使用Gradle构建Groovy JAR并将其发布到内部 repo 中

java - 当我转换包含变量的对象时,为什么它不显示变量的值?