提问:布和纸怕什么?

painless script 如何在不同子script内共享变量

Elasticsearch | 作者 nainc | 发布于2017年09月05日 | 阅读数:4308

现在有这样一个表结构:
"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
}

 
已邀请:

kennywu76 - Wood

赞同来自:

据我所知,不同查询子句里的script不能够共享中间变量。

要回复问题请先登录注册