# Accessing Data in Pipelines（访问管道中的数据）

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/accessing-data-in-pipelines.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/accessing-data-in-pipelines.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=9406187](http://www.apache.wiki/pages/viewpage.action?pageId=9406187)

贡献者 : [那伊抹微笑](/display/~wangyangting)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

该 **pipeline**（管道）中的 **processor**（处理器）对通过 **pipeline**（管道）的 **document**（文档）进行读写访问操作。该 **processor**（处理器）可以访问 **source** **of** **document**（源文档）中的 **fields**（字段）以及 **document**（文档）的 **metadata** **field**（元数据字段）。

### Accessing Fields in the Source（访问源文档中的字段）

访问 **source**（源文档）中的 **field** 是很简单的。您可以简单的通过它们的 **name**（名字）来引用 **fields**（字段）。例如 : 

```
{
  "set": {
    "field": "my_field"
    "value": 582.1
  }
}
```

除此之外，**source**（源文档）中的 **field**（字段）始终可以通过 **_source** 前缀来访问 : 

```
{
  "set": {
    "field": "_source.my_field"
    "value": 582.1
  }
}
```

### Accessing Metadata Fields（访问元数据字段）

您可以使用您在 **source**（源文档）中访问 **field**（字段）一样的方式来访问 **metadata** **fields**（元数据字段）。这是可以做到的，因为 **Elasticsearch** 不会允许 **source**（源文档）中的 **fields**（字段） 与 **metadata** **fields**（元数据字段）拥有一样的 **name**（名字）。

以下示例将 **document**（文档）的 **_id****metadata****field**（元数据字段）设置为 **1** : 

```
{
  "set": {
    "field": "_id"
    "value": "1"
  }
}
```

以下 **metadata** **fields**（元数据字段）可以通过 **processor**（处理器）来访问 : **_index**，**_type**，**_id**，**_routing**，**_parent**。

### Accessing Ingest Metadata Fields（访问 Ingest 的元数据字段）

除了 **metadata** **fileds**（元数据字段）和 **source** **fields**（源文档字段）之外，**ingest** 也可以添加 **ingest** **metadata** 到它处理的 **documents**（文档）中去。这些 metadata properties（元数据属性）可以在 **_ingest** **key** 下进行访问。目前，**ingest** 会在 **ingest** **metadata** 的 **_ingest.timestamp key** 下添加 **ingest** **timestamp** 属性。该 **ingest** **timestamp** 是在 **Elasticsearch** 接收 **index**（索引）或 **bulk** **request** 来预处理 **document**（文档）的 **time**（时间）。

任何 **processor**（处理器）都可以在 **document**（文档）处理期间添加与 **ingest** 相关的 **metadata**（元数据）。**Ingest** **metadata** 是 **transient**（瞬时的），并且在 **pipeline**（管道）处理 **document**（文档）后丢失。因此，**ingest** **metadata** 将不会被索引。

以下示例添加了一个名为 **received** 的 **field**（字段），它的值是 **ingest** 的 **timestamp** : 

```
{
  "set": {
    "field": "received"
    "value": "{{_ingest.timestamp}}"
  }
}
```

与 **Elasticsearch** **metadata** **fields** 不一样的是，这个名为 **_ingest** 的 **metadata** **fields** 可以作为 **source** **of** **document**（源文档）中的有效名称。使用 **_source._ingest** 来引用 **source** **document**（源文档）中的 **field**（字段）。否则，**_ingest** 将会被作为一个 **ingest** **metadata** **field** 来解释。

### Accessing Fields and Metafields in Templates（访问模版中的字段和元数据字段）

一些 **processor**（处理器）的设置也支持模板化。所支持模版的设置可以有零到多个 **template** **snippets**（模版片段）。一个 **template** **snippets**（模版片段）以 **{{** 开始并以 **}}** 结束。在模板中访问 **field**（字段）和 **metadata**（元数据）与通过普通的 **processor**（处理器）**field**（字段）设置完全相同。

以下示例添加了一个名为 **field_c** 的 **field**（字段）。它的值为 **field_a** 和 **field_b** 的值的 **concatenation**（串联）。

```
{
  "set": {
    "field": "field_c"
    "value": "{{field_a}} {{field_b}}"
  }
}
```

以下示例使用 **source**（源文档）中 **geoip.country_iso_code** 字段的值来设置 **document** 将要被索引到的 **index**（索引）。

```
{
  "set": {
    "field": "_index"
    "value": "{{geoip.country_iso_code}}"
  }
}
```