简而言之,问题 :执行带有子聚合的查询时,内部聚合为什么在某些情况下会丢失数据?
详细问题 :我有一个带有子聚合(存储桶中的存储桶)的搜索查询,如下所示:
{ "size": 0, "aggs": { "outer_docs": { "terms": {"size": 20, "field": "field_1_to_aggregate_on"}, "aggs": { "inner_docs": { "terms": {"size": 10000, "field": "field_2_to_aggregate_on"}, "aggs": "things to display here" } } } } }
如果我执行此查询,对于某些external_docs,我不会收到与之关联的所有inner_docs。在下面的输出中,有三个用于外部文档key_1的内部文档。
{ "hits": { "total": 9853, "max_score": 0.0, "hits": [] }, "aggregations": { "outer_docs": { "doc_count_error_upper_bound": -1, "sum_other_doc_count": 9801, "buckets": [ { "key": "key_1", "doc_count": 3, "inner_docs": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ {"key": "1", "doc_count": 1, "some": "data here"}, ... {"key": "3", "doc_count": 1, "some": "data here"}, ] } }, ... ] } } }
现在,我添加了一个查询,以单选一个反而应该在前20个中使用的external_doc。
"query": {"bool": {"must": [{'term': {'field_1_to_aggregate_on': 'key_1'}}]}}
在这种情况下,我确实获得了所有inner_docs,它们都在外部文档key_1的七个内部文档下面的输出中。
{ "hits": { "total": 8, "max_score": 0.0, "hits": [] }, "aggregations": { "outer_docs": { "doc_count_error_upper_bound": -1, "sum_other_doc_count": 9801, "buckets": [ { "key": "key_1", "doc_count": 8, "inner_docs": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ {"key": "1", "doc_count": 1, "some": "data here"}, ... {"key": "7", "doc_count": 2, "some": "data here"}, ] } }, ... ] } } }
我已经明确指定每个外部文件我要10,000个内部文件。是什么使我无法获取所有数据?
这是我的版本信息:
{ 'build_date': '2018-09-26T13:34:09.098244Z', 'build_flavor': 'default', 'build_hash': '04711c2', 'build_snapshot': False, 'build_type': 'deb', 'lucene_version': '7.4.0', 'minimum_index_compatibility_version': '5.0.0', 'minimum_wire_compatibility_version': '5.6.0', 'number': '6.4.2' }
编辑 :经过更多研究后,我发现问题与子聚合无关,但与聚合本身和分片的使用无关。我已经为Elastic打开了这个错误报告:
事实证明,该问题并非归因于子聚合,而这是ElasticSearch的实际功能。我们使用5个分片,使用分片时,聚合仅返回近似结果。
我们已使该问题可重现,并将其发布在Elastic forum中。在这里,我们了解到聚合并不总是返回所有数据,而是提供了指向文档的链接,其中对此进行了更详细的说明。
我们还了解到,仅使用1个分片即可解决该问题,并且在不可能的情况下,该参数shard_size可以缓解此问题。
shard_size