Elasticsearch无需重建索引实现text字段全值去重聚合
问题描述
- 待查询文档数据总规模约350TB,重建索引方案不可行,可接受合理范围内的查询性能损耗。
- 现有索引中
s3_filename字段映射为{"type": "text"},未配置任何子字段。为该字段设置fielddata: true后执行聚合,结果不符合预期:返回的是字段值经分词拆分后独立词元的去重结果,而非完整字段值的去重结果。 - 例如
s3_filename字段取值为ud20220711/long-file-name-20220711.json.gz时,预期对完整文件名做聚合统计,实际得到的是拆分后的词元分桶,如long、file、name、20220711、json、gz,不存在对应完整文件名的分桶,尝试普通terms聚合、composite聚合均无法解决该问题。
解决方案
无需重建索引,在查询内定义runtime fields(运行时字段),将s3_filename临时指定为keyword类型即可得到符合预期的聚合结果,查询语句如下:
{ "runtime_mappings": { "s3_filename": { "type": "keyword" } }, "aggs": { "filenames": { "terms": { "field": "s3_filename", "size": 10000 } } } }
性能评估
- 上述查询耗时为同数据集普通聚合查询的18倍,在350TB数据集上总耗时约74分钟。
- 对比重建350TB索引所需的约15天耗时,该方案带来的性能损耗完全在可接受范围内。
内容的提问来源于stack exchange,提问作者Wayne Walker
相关产品推荐
相关产品推荐

