弹力无痛'state'替代品
Elastic painless 'state' alternative
这是我第一次尝试使用无痛脚本,但是几乎每个示例都使用了我的版本中不可用的 'state' 对象。
即
"aggs": {
"terms": {
"scripted_metric": {
"init_script": "state.id_map = [:]; state.sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!state.id_map.containsKey(id)) {
state.id_map[id] = true;
state.sum += doc['VAL'].value;
}
""",
"combine_script": """
def sum = state.sum;
def stats = [:];
stats.sum = sum;
return stats
""",
"reduce_script": "return states"
}
}
}
结果:未定义变量 [state]。
省略它也无济于事
即
"init_script": "Map id_map = new HashMap(); double sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!id_map.containsKey(id)) {
id_map[id] = true;
sum += doc['VAL'].value;
}
""",
结果:
“变量 [id_map] 未定义。”在 map_script 部分
早期版本的替代方法是什么?
您上面的脚本在 6.4 及更高版本中工作正常。
因为你是 运行 ES 5.x 你需要 change a little bit the syntax:
- 将
state
替换为params._agg
- 将
states
替换为params._aggs
像这样:
"aggs": {
"terms": {
"scripted_metric": {
"init_script": "params._agg.id_map = [:]; params._agg.sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!params._agg.id_map.containsKey(id)) {
params._agg.id_map[id] = true;
params._agg.sum += doc['VAL'].value;
}
""",
"combine_script": """
def sum = params._agg.sum;
def stats = [:];
stats.sum = sum;
return stats
""",
"reduce_script": "return params._aggs"
}
}
}
这是我第一次尝试使用无痛脚本,但是几乎每个示例都使用了我的版本中不可用的 'state' 对象。
即
"aggs": {
"terms": {
"scripted_metric": {
"init_script": "state.id_map = [:]; state.sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!state.id_map.containsKey(id)) {
state.id_map[id] = true;
state.sum += doc['VAL'].value;
}
""",
"combine_script": """
def sum = state.sum;
def stats = [:];
stats.sum = sum;
return stats
""",
"reduce_script": "return states"
}
}
}
结果:未定义变量 [state]。
省略它也无济于事 即
"init_script": "Map id_map = new HashMap(); double sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!id_map.containsKey(id)) {
id_map[id] = true;
sum += doc['VAL'].value;
}
""",
结果: “变量 [id_map] 未定义。”在 map_script 部分
早期版本的替代方法是什么?
您上面的脚本在 6.4 及更高版本中工作正常。
因为你是 运行 ES 5.x 你需要 change a little bit the syntax:
- 将
state
替换为params._agg
- 将
states
替换为params._aggs
像这样:
"aggs": {
"terms": {
"scripted_metric": {
"init_script": "params._agg.id_map = [:]; params._agg.sum = 0.0;",
"map_script": """
def id = doc['record_id.ID'].value;
if (!params._agg.id_map.containsKey(id)) {
params._agg.id_map[id] = true;
params._agg.sum += doc['VAL'].value;
}
""",
"combine_script": """
def sum = params._agg.sum;
def stats = [:];
stats.sum = sum;
return stats
""",
"reduce_script": "return params._aggs"
}
}
}