Date Index Name Processor(日期索引名称处理器)

processor(处理器)的目的是通过使用 date math index name support 来将文档指向正确的时间以建立 index(索引),该 date(时间)基于 document(文档)中的 date(日期)或 timestamp(时间戳)字段。

该 processor(处理器)根据提供的 index name prefix(索引名称前缀),正在被处理的 document(文档)中的 date(日期)或 timestamp(时间戳)字段以及所提供的 date rounding(日期舍入),与 a date math index name expression(一个日期的数学表达式索引名称)来设置 _index meta field(元字段)。

首先,该 processor(处理器)从正在处理的 document(文档)中的 field(字段)抓取 date(日期)或 timestamp(时间戳)。或者,可以配置 date formatting(日期格式)以便如何将 field's value(字段的值)解析成 date(日期)。那么这个 date(日期),所提供的 index name prefix(索引名称前缀)和所提供的 date rounding(日期舍入)将会被格式化为 a date math index name expression(一个日期的数学表达式索引名称)。此外,还可以选择 date formatting(日期格式化)以指定 date(日期)应该如何被格式化成 a date math index name expression(一个日期的数学表达式索引名称)。

以下一个示例 pipeline(管道),它将 documents(文档)指向基于 date1 字段中日期的,以 myindex- 前缀开头的 monthly index(月度索引): 

curl -XPUT 'localhost:9200/_ingest/pipeline/monthlyindex?pretty' -H 'Content-Type: application/json' -d'
{
  "description": "monthly date-time index naming",
  "processors" : [
    {
      "date_index_name" : {
        "field" : "date1",
        "index_name_prefix" : "myindex-",
        "date_rounding" : "M"
      }
    }
  ]
}
'

针对 index request(索引请求)使用该 pipeline(管道): 

curl -XPUT 'localhost:9200/myindex/type/1?pipeline=monthlyindex&pretty' -H 'Content-Type: application/json' -d'
{
  "date1" : "2016-04-25T12:02:01.789Z"
}
'
{
  "_index" : "myindex-2016-04-01",
  "_type" : "type",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}

以上请求将不会将此 document(文档)放入 myindex 索引,而是放入到 myindex-2016-04-01 索引中,因为它 rounded by month(按月舍入)。产生这样的结果是因为 date-index-name-processor(日期索引名称处理器)覆盖了 document(文档)的 _index 属性。

为了查看实际的 index request(索引请求)中提供给 index(索引)的 date-math 值,导致上述 document(文档)被索引到 myindex-2016-04-01 中,我们可以使用 simulate request(模拟请求)来检查 processor(处理器)的效果。

curl -XPOST 'localhost:9200/_ingest/pipeline/_simulate?pretty' -H 'Content-Type: application/json' -d'
{
  "pipeline" :
  {
    "description": "monthly date-time index naming",
    "processors" : [
      {
        "date_index_name" : {
          "field" : "date1",
          "index_name_prefix" : "myindex-",
          "date_rounding" : "M"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "date1": "2016-04-25T12:02:01.789Z"
      }
    }
  ]
}
'

结果如下 : 

{
  "docs" : [
    {
      "doc" : {
        "_id" : "_id",
        "_index" : "<myindex-{2016-04-25||/M{yyyy-MM-dd|UTC}}>",
        "_type" : "_type",
        "_source" : {
          "date1" : "2016-04-25T12:02:01.789Z"
        },
        "_ingest" : {
          "timestamp" : "2016-11-08T19:43:03.850+0000"
        }
      }
    }
  ]
}

上述示例 index(索引)已设置为 <myindex-{2016-04-25||/M{yyyy-MM-dd|UTC}}>Elasticsearch 理解这个意思,2016-04-01 正如 date math index name documentation 所描述的那样。

Table 17. Date index name options(表 17. 日期索引名称选项)

Name(名称) Required(必要的) Default(默认值) Description(描述)
field yes - 获取 date(日期)或 timestamp(时间戳)的 field(字段)。
index_name_prefix no - 在打印日期之前要添加的 index name(索引名称)的前缀。
date_rounding yes - 在格式化 date(日期)为 index name(索引名称)时如何舍入日期。有效值是 : y (year), M(month), w (week), d (day), h (hour), m (minute) and s (second)。
date_formats no yyyy-MM-dd’T'HH:mm:ss.SSSZ 预处理 document(文档)中用于解析 dates(日期) / timestamps(时间戳)的预期的 date formats(日期格式)的 array(数组)。可以是 Joda pattern 或者以下格式之一 : ISO8601UNIXUNIX_MS 或 TAI64N
timezone no UTC 在解析 date(日期)以及当 date math index(日期数学索引)支持解析表达式到具体的 index name(索引名称)时所使用的 timezone(时区)。
locale no ENGLISH 在从预处理文档中解析 date(日期)时要用的 locale(语言环境),与解析的 month names 或 week days 有关。
index_name_format no yyyy-MM-dd 在打印 parsed date(解析的日期)到 index name(索引名称)时要使用的格式。这里预期是一个有效的 Joda pattern。