提问者:小点点

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


我正在使用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()

这工作得很好,但在响应.聚合中只返回10个结果。per_ts。桶

我要所有的结果

我已经尝试了一个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个答案

匿名用户

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

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对于所有桶结果将不再起作用,请参考此线程。在我的示例中,我只是将大小设置为999999。你可以根据你的情况选择一个大数字。

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

希望这有帮助。

匿名用户

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

我发现最好的事情是创建一个像这样的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

这里的神奇之处在于,弹性会自动将结果的数量划分为20,即我定义的分区数。我只需要将大小设置为足以容纳单个分区的大小,在这种情况下,结果最多可以是2000万大的项目(或20*999999)。如果你像我一样有更少的项目要返回(如20000),那么你的桶中每个查询只有1000个结果,不管你定义了更大的大小。

使用上面概述的生成器结构,您甚至可以摆脱它并创建自己的扫描仪,可以这么说,单独迭代所有结果,这正是我想要的。

匿名用户

你应该读留档。

所以在你的例子中,应该是这样的:

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()