Elasticsearch专家,
我一直无法找到一种简单的方法来告诉ElasticSearch为所有索引(以及所有文档类型)中添加的所有文档插入_timestamp字段。
我看到了特定类型的示例: http://www.elasticsearch.org/guide/reference/mapping/timestamp-field/
并且还查看特定类型的所有索引的示例(使用_all): http://www.elasticsearch.org/guide/reference/api/admin-indices-put-mapping/
但我无法找到任何关于添加所有文档的文档,无论索引和类型如何都会添加。
答案 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,从而模拟您可能从 Django 和 auto_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相关参数,因此该示例应该可以工作。