如何使用Python的elasticsearch_dsl搜索对脚本字段求和?

时间:2018-05-25 17:09:50

标签: elasticsearch python-3.6 elasticsearch-dsl elasticsearch-dsl-py

这对我有用:

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后,数字与预期一致。

0 个答案:

没有答案