我的弹性索引中有大量数据(例如每个索引25GB的数据,每个索引都是每天创建的,即每天创建一个索引),并且我可以拥有1(最小)到60(最大)的数据这样的索引,我需要基于所有给定索引中的几个键进行聚合。
我的ElasticSearch是一个运行ElasticSearch 6.x的4节点集群设置
我正在使用Java线程对每个索引运行复合聚合查询,该查询分页并获取每个索引的聚合结果,这为我提供了为聚合选择的键及其计数的所有唯一组合[请参见下面的示例]。
我将每天的结果存储到 date add new
0 2019-12-21 30 days 2019-12-21
1 2019-11-13 90 days 2020-02-11
中,并将每天的列表数据合并到一个巨大的List<Map<String, Object>>
中,它将包含来自所有索引的所有数据,然后使用{ {1}}对来自此列表的重复项进行分组,并对计数求和。
这里的问题是,由于唯一的组合非常庞大(每个索引的顺序为数百万个,并且该组合也会在其他索引中重复),所以我用完了Java内存,存储每个索引的结果并进行分组。
如何用有限的资源解决此问题,而不用尽内存? Lucene的Indexing可以在这里帮助存储中间结果并避免堆内存不足吗?或者redis可以在这里帮助存储中间结果并避免堆内存不足吗?
请帮助我解决这个问题。
如果我一次在所有索引上运行一个查询,则由于CPU使用率高,每个索引都需要一个单独的查询
索引内的样本数据
List
综合汇总查询
Collections.groupingBy(...)
结果
[
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
...[MAX 40 Key-Value Paris]
},
{
"key1": "value4",
"key2": "value5",
"key3": "value6",
...[MAX 40 Key-Value Paris]
},
....
]