日期索引名称处理器

编辑

此处理器的目的是使用日期数学索引名称支持,根据文档中的日期或时间戳字段将文档指向正确的基于时间的索引。

此处理器使用基于提供的索引名称前缀、正在处理的文档中的日期或时间戳字段以及提供的日期舍入的日期数学索引名称表达式设置 _index 元数据字段。

首先,此处理器从正在处理的文档中的字段中获取日期或时间戳。可以选择配置日期格式,以指定应如何将字段的值解析为日期。然后,将此日期、提供的索引名称前缀和提供的日期舍入格式化为日期数学索引名称表达式。同样,这里可以选择指定日期格式,以指定应如何将日期格式化为日期数学索引名称表达式。

一个示例管道,它根据 date1 字段中的日期将文档指向以 my-index- 前缀开头的每月索引

resp = client.ingest.put_pipeline(
    id="monthlyindex",
    description="monthly date-time index naming",
    processors=[
        {
            "date_index_name": {
                "field": "date1",
                "index_name_prefix": "my-index-",
                "date_rounding": "M"
            }
        }
    ],
)
print(resp)
response = client.ingest.put_pipeline(
  id: 'monthlyindex',
  body: {
    description: 'monthly date-time index naming',
    processors: [
      {
        date_index_name: {
          field: 'date1',
          index_name_prefix: 'my-index-',
          date_rounding: 'M'
        }
      }
    ]
  }
)
puts response
const response = await client.ingest.putPipeline({
  id: "monthlyindex",
  description: "monthly date-time index naming",
  processors: [
    {
      date_index_name: {
        field: "date1",
        index_name_prefix: "my-index-",
        date_rounding: "M",
      },
    },
  ],
});
console.log(response);
PUT _ingest/pipeline/monthlyindex
{
  "description": "monthly date-time index naming",
  "processors" : [
    {
      "date_index_name" : {
        "field" : "date1",
        "index_name_prefix" : "my-index-",
        "date_rounding" : "M"
      }
    }
  ]
}

将该管道用于索引请求

resp = client.index(
    index="my-index",
    id="1",
    pipeline="monthlyindex",
    document={
        "date1": "2016-04-25T12:02:01.789Z"
    },
)
print(resp)
response = client.index(
  index: 'my-index',
  id: 1,
  pipeline: 'monthlyindex',
  body: {
    "date1": '2016-04-25T12:02:01.789Z'
  }
)
puts response
const response = await client.index({
  index: "my-index",
  id: 1,
  pipeline: "monthlyindex",
  document: {
    date1: "2016-04-25T12:02:01.789Z",
  },
});
console.log(response);
PUT /my-index/_doc/1?pipeline=monthlyindex
{
  "date1" : "2016-04-25T12:02:01.789Z"
}
{
  "_index" : "my-index-2016-04-01",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 55,
  "_primary_term" : 1
}

上面的请求不会将此文档索引到 my-index 索引中,而是索引到 my-index-2016-04-01 索引中,因为它按月舍入。这是因为日期索引名称处理器会覆盖文档的 _index 属性。

要查看实际索引请求中提供的索引的日期数学值,该请求导致上面的文档被索引到 my-index-2016-04-01 中,我们可以使用模拟请求来检查处理器的效果。

resp = client.ingest.simulate(
    pipeline={
        "description": "monthly date-time index naming",
        "processors": [
            {
                "date_index_name": {
                    "field": "date1",
                    "index_name_prefix": "my-index-",
                    "date_rounding": "M"
                }
            }
        ]
    },
    docs=[
        {
            "_source": {
                "date1": "2016-04-25T12:02:01.789Z"
            }
        }
    ],
)
print(resp)
response = client.ingest.simulate(
  body: {
    pipeline: {
      description: 'monthly date-time index naming',
      processors: [
        {
          date_index_name: {
            field: 'date1',
            index_name_prefix: 'my-index-',
            date_rounding: 'M'
          }
        }
      ]
    },
    docs: [
      {
        _source: {
          "date1": '2016-04-25T12:02:01.789Z'
        }
      }
    ]
  }
)
puts response
const response = await client.ingest.simulate({
  pipeline: {
    description: "monthly date-time index naming",
    processors: [
      {
        date_index_name: {
          field: "date1",
          index_name_prefix: "my-index-",
          date_rounding: "M",
        },
      },
    ],
  },
  docs: [
    {
      _source: {
        date1: "2016-04-25T12:02:01.789Z",
      },
    },
  ],
});
console.log(response);
POST _ingest/pipeline/_simulate
{
  "pipeline" :
  {
    "description": "monthly date-time index naming",
    "processors" : [
      {
        "date_index_name" : {
          "field" : "date1",
          "index_name_prefix" : "my-index-",
          "date_rounding" : "M"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "date1": "2016-04-25T12:02:01.789Z"
      }
    }
  ]
}

结果如下

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

上面的示例显示 _index 被设置为 <my-index-{2016-04-25||/M{yyyy-MM-dd|UTC}}>。如日期数学索引名称文档中所述,Elasticsearch 将其理解为 2016-04-01

表 12. 日期索引名称选项

名称 必需 默认值 描述

field

-

从中获取日期或时间戳的字段。

index_name_prefix

-

要在打印的日期之前添加的索引名称的前缀。支持模板片段

date_rounding

-

将日期格式化为索引名称时如何舍入日期。有效值包括:y(年)、M(月)、w(周)、d(日)、h(小时)、m(分钟)和 s(秒)。支持模板片段

date_formats

yyyy-MM-dd'T'HH:mm:ss.SSSXX

用于解析预处理文档中的日期/时间戳的预期日期格式数组。可以是 java 时间模式或以下格式之一:ISO8601、UNIX、UNIX_MS 或 TAI64N。

timezone

UTC

解析日期以及日期数学索引支持将表达式解析为具体索引名称时要使用的时区。

locale

ENGLISH

从预处理文档中解析日期时要使用的区域设置,当解析月份名称或工作日时相关。

index_name_format

yyyy-MM-dd

将解析的日期打印到索引名称时要使用的格式。此处应使用有效的 java 时间模式。支持模板片段

description

-

处理器的描述。用于描述处理器的目的或其配置。

if

-

有条件地执行处理器。请参阅有条件地运行处理器

ignore_failure

false

忽略处理器的故障。请参阅处理管道故障

on_failure

-

处理处理器的故障。请参阅处理管道故障

tag

-

处理器的标识符。用于调试和指标。