现在有这样一个表结构:
起始日期到结束日期范围内的总价格在[x,y]区间,并且每天库存大于z。按库存量排序。
目前是写的painless script来实现的,虽然已经支持了搜索需求,但是发现了一个性能问题:filter,排序和返回结果需要跑一个script一次,但是其实每个脚本的逻辑是很相似的,所以想咨询一下,有没有一些跨子脚本共享变量的方法,或者是储存脚本内变量的方法?
具体查询代码:
"sku": {"_routing": {
"required": true
},
"properties": {
"prices": {
"type": "long"
},
"stocks": {
"type": "long"
}
}
}
然后数据是以数组形式存储的:{
"id": 3222,
"prices": [ 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40],
"stocks": [ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
}
搜索需求是这样的:起始日期到结束日期范围内的总价格在[x,y]区间,并且每天库存大于z。按库存量排序。
目前是写的painless script来实现的,虽然已经支持了搜索需求,但是发现了一个性能问题:filter,排序和返回结果需要跑一个script一次,但是其实每个脚本的逻辑是很相似的,所以想咨询一下,有没有一些跨子脚本共享变量的方法,或者是储存脚本内变量的方法?
具体查询代码:
{
"query":{
"has_child":{
"type":"sku",
"min_children":1,
"query":{
"function_score":{
"boost_mode":"sum",
"query":{
"bool":{
"filter":{
"bool":{
"must":[
{
"script":{
"script":{
"lang":"painless",
"inline":"
int duration = params.duration;
int start_offset = 0;
int end_offset = start_offset + params.duration;
def stock_arr = []; # 希望能够在别的script中也能使用的数据
for(int i = start_offset; i <= end_offset; i++){
long stock = doc['stocks'].values[i];
stock_arr.add(stock)
if(stock <= 0){
return false;
}
}
true;",
"params":{
"duration":3
}
}
}
}
]
}
}
}
},
"script_score":{
"script": "
希望能够直接使用filter的stock_arr 而不是再次用filter的逻辑计算一遍;
return sum(stock_arr);
"
}
}
},
"inner_hits":{
"script_fields":{
"price":{
"script":{
"lang":"painless",
"inline": "希望能够直接使用filter的stock_arr 而不是再次用filter的逻辑计算一遍;",
"params":{
"duration":3
}
}
}
}
}
}
},
"size":2
}
1 个回复
kennywu76 - Wood
赞同来自: