我正在使用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
我想要所有结果
我已尝试使用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]')
答案 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()