这对我有用:
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方面的总和会快得多。
更新
基于this discussion at elasticsearch forum我认为我找到了它应该工作的方式,但它仍然无法正常工作。您可以在聚合内部提供脚本,如下所示:
s=Search(using=client, index='my_index').aggs.pipeline('total', 'sum', script={'source': "<the special formula>"})
现在的问题是输出不正确。在具有给定时间的一个项目的测试索引上,我尝试在总和聚合中报告该字段,而不是预期的结果(字段的值),我得到的东西与128不同。
更新
我在elasticsearch帮助论坛中收到了对最后一个问题的回答:https://discuss.elastic.co/t/script-aggregation-yields-wrong-but-close-answer/133744/3?u=rschwieb
简而言之,存储在字段中的数据被弹性搜索解释为double,但聚合使用的是由索引映射确定的类型(代之以“float”)。将字段重新索引为double后,数字与预期一致。