如何在 ElasticSearch 内联脚本中使用最小值/最大值?

rsc*_*ieb 4 elasticsearch elasticsearch-painless elasticsearch-6

在这里学习一些elasticsearch,我对在脚本化字段定义中使用 min 和 max 函数感到有点困惑。第一的,

GET my_index/_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "min(doc[\"this field\"],5)"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的回报是

"error": {
"root_cause": [
  {
    "type": "script_exception",
    "reason": "compile error",
    "script_stack": [
      "min(doc[\"end\"],5)",
      "^---- HERE"
    ],
    "script": "min(doc[\"end\"],5)",
    "lang": "painless"
  }
], ...
Run Code Online (Sandbox Code Playgroud)

我想也许我需要给它命名Long.min并返回

"reason": "runtime error",
      "script_stack": [
        """Long.min(doc["end"],5)""",
        "            ^---- HERE"
      ],
Run Code Online (Sandbox Code Playgroud)

这看起来是进步,但为什么会出现问题呢doc

它们似乎在无痛 API 参考中,我认为如果它们不可用,那就有点愚蠢了。我一直在寻找“无痛最小最大功能”的组合,但我得到的只是上面链接的内容和一堆不相关的东西。

我在这里做错了什么?

rsc*_*ieb 6

我终于偶然发现了答案。我一直在根据我发现的示例使用转义引号,并将它们替换为单引号导致我收到错误消息,从而使我进入工作版本。我犯的另一个错误是没有使用.valueondoc['this field']来恢复实际的数字类型。工作版本是:

GET my_index/_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "Math.min(doc['this field'].value,5)"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Double.min(匹配“此字段”的类型)也有效,但我认为 Math.min 应该更灵活。