如何在ElasticSearch内联脚本中使用min / max?

时间:2018-05-24 21:07:31

标签: elasticsearch elasticsearch-painless elasticsearch-6

在这里学习一些弹性搜索,我对在脚本字段定义中使用min和max函数感到有点困惑。首先,

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

我获得了奖励

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

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

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

这似乎是进步,但为什么问题会是doc

它们似乎出现在painless API reference中,我认为如果没有它们会有点愚蠢。我一直在寻找“无痛最小最大功能”的组合,但我得到的就是我上面提到的和一些不相关的东西。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

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

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

Double.min(匹配'此字段'的类型)也有效,但我认为Math.min意味着更灵活。