我正在使用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]')
我也遇到了同样的问题。我终于找到了这个解决方案:
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()