2

这对我来说是正确的:

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

简而言之,存储在字段中的数据被弹性搜索解释为双精度,但聚合使用由索引映射确定的类型(改为“浮动”)。将字段重新索引为双精度后,数字与预期一致。

4

0 回答 0