加载中

映射运行时字段

您可以通过在映射定义下添加 runtime 部分并定义 Painless 脚本来映射运行时字段。此脚本可以访问文档的完整上下文,包括通过 params._source 访问原始 _source 以及任何已映射字段及其值。在查询时,脚本运行并为查询所需的每个脚本字段生成值。

发出(Emit)运行时字段值

在定义用于运行时字段的 Painless 脚本时,必须包含 emit 方法以发出计算出的值。

例如,以下请求中的脚本会从定义为 date 类型的 @timestamp 字段中计算星期几。该脚本基于 timestamp 的值计算星期几,并使用 emit 返回计算出的值。

				PUT my-index-000001/
					{
  "mappings": {
    "runtime": {
      "day_of_week": {
        "type": "keyword",
        "script": {
          "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
        }
      }
    },
    "properties": {
      "@timestamp": {"type": "date"}
    }
  }
}
		

runtime 部分可以是以下任何数据类型

  • boolean
  • composite
  • date
  • double
  • geo_point
  • ip
  • keyword
  • long
  • lookup

typedate 的运行时字段可以像 date 字段类型一样接受 format 参数。

typelookup 的运行时字段允许从相关索引中检索字段。请参阅 retrieve fields from related indices

如果启用了动态字段映射(dynamic 参数设置为 runtime),则新字段会自动作为运行时字段添加到索引映射中

				PUT my-index-000001
					{
  "mappings": {
    "dynamic": "runtime",
    "properties": {
      "@timestamp": {
        "type": "date"
      }
    }
  }
}
		

运行时字段通常包含以某种方式操作数据的 Painless 脚本。但是,在某些情况下,您可能需要定义不带脚本的运行时字段。例如,如果您想在不进行更改的情况下从 _source 中检索单个字段,则不需要脚本。您可以直接创建一个不带脚本的运行时字段,例如 day_of_week

				PUT my-index-000001/
					{
  "mappings": {
    "runtime": {
      "day_of_week": {
        "type": "keyword"
      }
    }
  }
}
		

如果未提供脚本,Elasticsearch 会在查询时隐式地在 _source 中查找与运行时字段同名的字段,如果存在则返回一个值。如果不存在同名字段,则响应不会包含该运行时字段的任何值。

在大多数情况下,请尽可能通过 doc_values 检索字段值。由于数据从 Lucene 加载的方式,使用运行时字段访问 doc_values 比从 _source 检索值更快。

但是,在某些情况下,从 _source 检索字段是必要的。例如,text 字段默认情况下没有 doc_values,因此您必须从 _source 中检索值。在其他情况下,您可能会选择在特定字段上禁用 doc_values

注意

或者,您可以在要检索值的字段前加上 params._source 前缀(例如 params._source.day_of_week)。为简单起见,尽可能在映射定义中定义不带脚本的运行时字段是推荐的做法。

脚本可能会在运行时抛出错误,例如在访问文档中缺失或无效的值时,或者因为执行了无效操作时。on_script_error 参数可用于控制发生这种情况时的错误行为。将此参数设置为 continue 将会静默忽略此运行时字段上的所有错误。默认值 fail 将导致分片失败,并在搜索响应中进行报告。

您可以随时更新或删除运行时字段。要替换现有的运行时字段,请在映射中添加一个同名的新运行时字段。要从映射中删除运行时字段,请将该运行时字段的值设置为 null

				PUT my-index-000001/_mapping
					{
 "runtime": {
   "day_of_week": null
 }
}
		
下游影响

在依赖查询运行时更新或删除运行时字段可能会导致返回不一致的结果。根据映射更改生效的时间,每个分片可能会访问不同版本的脚本。

警告

如果您删除或更新了字段,Kibana 中依赖运行时字段的现有查询或可视化可能会失败。例如,如果将类型更改为 boolean 或删除了该运行时字段,则使用类型为 ip 的运行时字段的条形图可视化将失败。

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.