elasticsearch-dsl聚合仅返回10个结果。如何改变这一点

时间:2017-11-10 09:47:17

标签: python elasticsearch elasticsearch-dsl

我正在使用elasticsearch-dsl python库连接到elasticsearch并进行聚合。

我正在关注代码

search.aggs.bucket('per_date', 'terms', field='date')\
        .bucket('response_time_percentile', 'percentiles', field='total_time',
                percents=percentiles, hdr={"number_of_significant_value_digits": 1})
response = search.execute()

这很好但在response.aggregations.per_ts.buckets

中只返回10个结果

我想要所有结果

我已尝试使用this question

中提到的size=0解决方案
search.aggs.bucket('per_ts', 'terms', field='ts', size=0)\
        .bucket('response_time_percentile', 'percentiles', field='total_time',
                percents=percentiles, hdr={"number_of_significant_value_digits": 1})

response = search.execute()

但这会导致错误

TransportError(400, u'parsing_exception', u'[terms] failed to parse field [size]')

3 个答案:

答案 0 :(得分:2)

我有同样的问题。我终于找到了这个解决方案:

s = Search(using=client, index="jokes").query("match", jks_content=keywords).extra(size=0)
a = A('terms', field='jks_title.keyword', size=999999)
s.aggs.bucket('by_title', a)
response = s.execute()

2.x之后,size=0的所有存储桶结果将不再起作用,请参考此thread。在我的示例中,我将大小设置为999999。您可以根据自己的情况选择较大的数字。

  

建议为数字大小显式设置合理的值   在1到2147483647之间。

希望这会有所帮助。

答案 1 :(得分:1)

这有点老了,但我遇到了同样的问题。我想要的基本上是一个迭代器,可以用来遍历返回的所有聚合(我也有很多独特的结果)。

我发现最好的是创建一个像这样的python生成器

def scan_aggregation_results():
    i=0
    partitions=20
    while i < partitions:
        s = Search(using=elastic, index='my_index').extra(size=0)
        agg = A('terms', field='my_field.keyword', size=999999,
                include={"partition": i, "num_partitions": partitions})
        s.aggs.bucket('my_agg', agg)
        result = s.execute()

        for item in result.aggregations.my_agg.buckets:
            yield my_field.key
        i = i + 1

# in other parts of the code just do
for item in scan_aggregation_results():
    print(item)  # or do whatever you want with it

这里的神奇之处在于,elastic将自动将结果数除以20,即我定义的划分数。我只需要将大小设置为足以容纳单个分区的大小,在这种情况下,结果最多可以达到2000万个项目(或20 * 999999)。如果像我这样少得多的项可以返回(如20000),则不管定义的大小多大,存储桶中每个查询将只有1000个结果。

使用上面概述的生成器构造,您甚至可以摆脱它而创建自己的扫描仪,可以这么说,逐个遍历所有结果,正是我想要的。

答案 2 :(得分:-1)

您应该阅读documentation

所以在你的情况下,这应该是这样的:

search.aggs.bucket('per_date', 'terms', field='date')\
            .bucket('response_time_percentile', 'percentiles', field='total_time',
                    percents=percentiles, hdr={"number_of_significant_value_digits": 1})[0:50]
response = search.execute()