如何使elasticsearch为所有索引中的每个文档添加时间戳字段?

时间:2013-06-16 17:58:52

标签: mapping timestamp elasticsearch

Elasticsearch专家,

我一直无法找到一种简单的方法来告诉ElasticSearch为所有索引(以及所有文档类型)中添加的所有文档插入_timestamp字段。

我看到了特定类型的示例: http://www.elasticsearch.org/guide/reference/mapping/timestamp-field/

并且还查看特定类型的所有索引的示例(使用_all): http://www.elasticsearch.org/guide/reference/api/admin-indices-put-mapping/

但我无法找到任何关于添加所有文档的文档,无论索引和类型如何都会添加。

6 个答案:

答案 0 :(得分:32)

您可以在创建索引时提供此功能。

$curl -XPOST localhost:9200/test -d '{
"settings" : {
    "number_of_shards" : 1
},
"mappings" : {
    "_default_":{
        "_timestamp" : {
            "enabled" : true,
            "store" : true
        }
    }
  }
}'

然后,它会自动为您放入索引的所有内容创建_timestamp。 然后在请求_timestamp字段时索引某些东西后,它将被返回。

答案 1 :(得分:32)

Elasticsearch过去常常支持自动为正在编制索引的文档添加时间戳,但2.0.0中的deprecated this feature

从版本5.5 documentation

  

_timestamp和_ttl字段已弃用,现已删除。作为_timestamp的替代,您应该使用应用程序端的当前时间戳填充常规日期字段

答案 2 :(得分:1)

添加另一种获取索引时间戳的方法。希望这可以帮助某人。

提取管道可用于为文档建立索引时添加时间戳。这里是一个示例示例:

PUT _ingest/pipeline/indexed_at
{
  "description": "Adds indexed_at timestamp to documents",
  "processors": [
    {
      "set": {
        "field": "_source.indexed_at",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}

之前,弹性搜索使用的是命名管道,因为需要在用于写入/索引文档的弹性搜索端点中指定“管道”参数。 (参考:link)这有点麻烦,因为您需要在应用程序端对端点进行更改。

在Elastic search version> = 6.5中,您现在可以使用index.default_pipeline设置为索引指定默认管道。 (有关详细信息,请参见link

这是设置默认管道的方法:

PUT ms-test/_settings
{
  "index.default_pipeline": "indexed_at"
}

我还没有尝试过,因为还没有升级到ES 6.5,但是上面的命令应该可以使用。

答案 3 :(得分:1)

您可以使用 default index pipelines,利用 script processor,从而模拟您可能从 Djangoauto_now_add 了解的 DEFAULT GETDATE() 功能{{ 3}}。

添加默认 yyyy-MM-dd HH:mm:ss 日期的过程如下:

1.创建 SQL 并指定允许它运行的索引:

PUT _ingest/pipeline/auto_now_add
{
  "description": "Assigns the current date if not yet present and if the index name is whitelisted",
  "processors": [
    {
      "script": {
        "source": """
          // skip if not whitelisted
          if (![ "myindex",
                 "logs-index",
                 "..."
              ].contains(ctx['_index'])) { return; }
          
          // don't overwrite if present
          if (ctx['created_at'] != null) { return; }
          
          ctx['created_at'] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        """
      }
    }
  ]
}

旁注:记录处理器的无痛脚本上下文pipeline

2.更新所有索引中的 default_pipeline 设置:

PUT _all/_settings
{
  "index": {
    "default_pipeline": "auto_now_add"
  }
}

旁注:您可以使用 here 限制目标索引:

PUT myindex,logs-2021-*/_settings?allow_no_indices=true
{
  "index": {
    "default_pipeline": "auto_now_add"
  }
}

3.将文档摄取到配置的索引之一:

PUT myindex/_doc/1
{
  "abc": "def"
}

4.验证是否已添加日期字符串:

GET myindex/_search

答案 4 :(得分:0)

首先创建索引和索引属性(例如字段和数据类型),然后使用其余的API插入数据。

下面是使用字段属性创建索引的方法。在kibana控制台中执行以下操作

`PUT /vfq-jenkins
{
"mappings": {
"properties": {
"BUILD_NUMBER": { "type" : "double"},
"BUILD_ID" : { "type" : "double" },
"JOB_NAME" : { "type" : "text" },
"JOB_STATUS" : { "type" : "keyword" },
"time" : { "type" : "date" }
 }}}`    

下一步是将数据插入该索引:     curl -u弹性:changeme -X POST http://elasticsearch:9200/vfq-jenkins/_doc/?pretty     -H内容类型:application / json -d'{     “ BUILD_NUMBER”:“ 83”,“ BUILD_ID”:“ 83”,“ JOB_NAME”:“ OMS_LOG_ANA”,“ JOB_STATUS”:“ SUCCESS”,     “ time”:“ 2019-09-08'T'12:39:00”}'

答案 5 :(得分:0)

Python 3中的ElasticSearch 6.6.2的示例。

from elasticsearch import Elasticsearch

es = Elasticsearch(hosts=["localhost"])

timestamp_pipeline_setting = {
  "description": "insert timestamp field for all documents",
  "processors": [
    {
      "set": {
        "field": "ingest_timestamp",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}

es.ingest.put_pipeline("timestamp_pipeline", timestamp_pipeline_setting)

conf = {
    "settings": {
        "number_of_shards": 2,
        "number_of_replicas": 1,
        "default_pipeline": "timestamp_pipeline"
    },
    "mappings": {
        "articles":{
            "dynamic": "false",
            "_source" : {"enabled" : "true" },
            "properties": {
                "title": {
                    "type": "text",
                },
                "content": {
                    "type": "text",
                },
            }
        }
    }
}

response = es.indices.create(
    index="articles_index",
    body=conf,
    ignore=400 # ignore 400 already exists code
)

print ('\nresponse:', response) 

doc = {
    'title': 'automatically adding a timestamp to documents',
    'content': 'prior to version 5 of Elasticsearch, documents had a metadata field called _timestamp. When enabled, this _timestamp was automatically added to every document. It would tell you the exact time a document had been indexed.',
}
res = es.index(index="articles_index", doc_type="articles", id=100001, body=doc)
print(res)

res = es.get(index="articles_index", doc_type="articles", id=100001)
print(res)

关于ES 7.x,由于不再支持doc_type相关参数,因此该示例应该可以工作。