字段上下文

编辑

使用 Painless 脚本创建一个脚本字段,为查询结果中的每个文档返回自定义的值。

变量

params (Map,只读)
作为查询的一部分传入的用户定义参数。
doc (Map,只读)
包含指定文档的字段,其中每个字段都是一个值的 List
params['_source'] (Map,只读)
包含存储文档中现有字段的 MapList 结构中提取的 JSON。

返回值

Object
每个文档的自定义值。

API

可以使用标准的 Painless API专用字段 API

示例

要运行此示例,请首先按照上下文示例中的步骤进行操作。

然后,您可以使用这两个示例脚本来计算每个搜索命中的自定义信息,并将其输出到两个新字段。

第一个脚本获取 datetime 字段的 doc value,并调用 getDayOfWeekEnum 函数来确定对应的星期几。

doc['datetime'].value.getDayOfWeekEnum().getDisplayName(TextStyle.FULL, Locale.ROOT)

第二个脚本计算演员的数量。演员的姓名存储在 actors 字段中,作为一个关键词数组。

doc['actors'].size()  

默认情况下,doc values 对于 text 字段不可用。如果 actors 是一个 text 字段,您仍然可以通过从 _source 中提取值,使用 params['_source']['actors'].size() 来计算演员的数量。

以下请求返回计算出的星期几以及每个剧本中出现的演员数量

GET seats/_search
{
  "size": 2,
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "day-of-week": {
      "script": {
        "source": "doc['datetime'].value.getDayOfWeekEnum().getDisplayName(TextStyle.FULL, Locale.ENGLISH)"
      }
    },
    "number-of-actors": {
      "script": {
        "source": "doc['actors'].size()"
      }
    }
  }
}
{
  "took" : 68,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 11,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "seats",
        "_id" : "1",
        "_score" : 1.0,
        "fields" : {
          "day-of-week" : [
            "Thursday"
          ],
          "number-of-actors" : [
            4
          ]
        }
      },
      {
        "_index" : "seats",
        "_id" : "2",
        "_score" : 1.0,
        "fields" : {
          "day-of-week" : [
            "Thursday"
          ],
          "number-of-actors" : [
            1
          ]
        }
      }
    ]
  }
}