【发布时间】:2020-01-24 17:28:24
【问题描述】:
我有以下问题。我在 Elasticsearch 中索引文档,其中每个文档由项目列表(在我的情况下为整数)表示,列表长度可能因文档而异。例如,doc1:[1,2,5],doc2:[2,3,5,6]等。各自的字段称为items。然后我执行一个脚本化的度量聚合,如下所示:
metrics = es.search(index=index, body=
{"query" : {
"match_all" : {}
},
"aggs": {
"frequent_pairs": {
"scripted_metric": {
"init_script" : "state.transactions = [];",
"map_script" : "state.transactions.add([params['_source']['items']);",
"combine_script" : naive_script,
"reduce_script" : reduce_cnt
}
}
}
})
映射只是将不同的项目列表分配到不同的分片。 然后我需要在每个分片中进行一些繁重的计算,即计算每个文档中所有大小为 3 的子集,并在哈希图中计算它们在分片中的数量。 (我知道,ElasticSearch 不适合用于此类计算,但我需要它用于应用程序。)
但这仅适用于文档列表较短或文档总数较少的情况。发生的情况是许多分片无法报告结果。我已经将堆空间增加到 8GB,分配了更多分片,并增加了超时值:
es = Elasticsearch([{'host':'localhost','port':9200, 'timeout': 1000000, "max_retries":10, "retry_on_timeout":True}])
这在一定程度上改善了结果,但仍有许多分片没有返回任何结果,微调参数似乎也无济于事。是否有任何解决方案或 ES 不应该用于如此昂贵的计算?我正在使用 ES 7.5.2,我很乐意应要求提供更多详细信息。
naive_script = """
HashMap itemsets = new HashMap();
int nr_trans = 0;
for (t in state.transactions){
nr_trans += 1;
int l = t.length;
for (int i=0; i<l; i++){
for (int j = i+1; j<l; j++){
for (int k = j+1; k < l; k++){
String s = Integer.toString(t[i]) + "," + Integer.toString(t[j]) + "," + Integer.toString(t[k]) + ",";
int val = 0;
if (itemsets.containsKey(s)){
val = itemsets.get(s);
}
itemsets.put(s, val + 1);
}
}
}
}
def res = [];
res.add(itemsets);
res.add(nr_trans);
return res;//itemsets;
"""
【问题讨论】:
标签: elasticsearch