这对我来说是正确的:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
)
现在我想special
在所有点击中附加一个总和。我试过这个:
search = Search(using=client, index='my_index').script_fields(
special={'script': {
'source': "<a formula that produces a double>"}
}
).aggs.metric('total', 'sum', field='special')
但是当我检查aggs
响应的属性时,我得到
{'total': {'value': 0.0}}
响应本身告诉我special
每个条目都正确填充,并且始终是肯定的。在我看来special
,在总和发生时它可能不存在,因此 elasticsearch 看不到它,因此它产生0
. 我尝试了pipeline
代替,metric
但这并没有改变事情。我提议的应该是可能的,对吧?
我可以在我的脚本中计算总和,而不是通过 elasticsearch,但我打赌 ES 端的总和会快得多。
更新
基于弹性搜索论坛上的讨论,我认为我找到了它应该工作的方式,但它仍然不能正常工作。您在聚合中提供脚本,如下所示:
s=Search(using=client, index='my_index').aggs.pipeline('total', 'sum', script={'source': "<the special formula>"})
现在的问题是输出不正确。在具有给定时间的一项的测试索引上,我尝试在总和聚合中报告该字段,而不是预期的结果(字段的值),我得到的结果与 128 不同。
更新
我在弹性搜索帮助论坛中收到了最后一个问题的答案:https ://discuss.elastic.co/t/script-aggregation-yields-wrong-but-close-answer/133744/3?u=rschwieb
简而言之,存储在字段中的数据被弹性搜索解释为双精度,但聚合使用由索引映射确定的类型(改为“浮动”)。将字段重新索引为双精度后,数字与预期一致。