无痛脚本 - 将字符串转换为def

时间:2017-08-01 10:21:22

标签: sorting elasticsearch elasticsearch-painless

我正在尝试获取字符串的数量。我正在使用正则表达式模式。当我得到结果时,我得到类似“1”,“10”,“2”的东西。我想对它进行排序,所以我需要在左边添加零,以便自然地对它们进行排序。

我的脚本在这里:

{
   "from": 0,
   "size": 40,
   "sort": [
      {
         "fields.myfield.keyword": { "order": "asc" }, 
         "_script": {
            "type": "string",
            "script": {
               "inline": 
               "def m = /(\\d+$)/.matcher(doc['fields.myfield.keyword'].value); 
               if ( m.find() ) 
                { 
                    String s = m.group(1); 
                    String.format(\"%05d\", s.toString()); 
                } 
                else { return 0 }"               
            },
            "order" : "asc"

         }
      }
   ],
   "_source": { "include": ["fields.myfield"] }}

当我尝试执行命令时,出现以下错误:

"failed_shards": [
{
   "shard": 0,
   "index": "myindex",
   "node": "kctN6d5ITrqtIMj4cbChKQ",
   "reason": {
      "type": "script_exception",
      "reason": "compile error",
      "script_stack": [
         "... ; String.format(\"%05d\", s.toString()); } else { re ...",
         "                             ^---- HERE"
      ],
      "script": "def m = /(\\d+$)/.matcher(doc['fields.myfield.keyword'].value); if ( m.find() ) { String s = m.group(1); String.format(\"%05d\", s.toString()); } else { return 0 }",
      "lang": "painless",
      "caused_by": {
         "type": "class_cast_exception",
         "reason": "Cannot cast from [String] to [def[]]."
      }
   }
}

如何在不使用String.Formatter的情况下添加零?

我在哪里尝试从STRING转为DEF?

1 个答案:

答案 0 :(得分:1)

添加零需要类型为数字而不是字符串。您是否尝试过Integer.valueOf(s)(仅仅在我的头顶,尚未经过验证)。