6

我正在尝试为我的数据添加时间戳,让 elasticsearch-py 对其进行批量索引,然后使用 kibana 显示数据。

我的数据显示在 kibana 中,但没有使用我的时间戳。当我在配置我的索引模式后转到“发现”选项卡时,我得到 0 个结果(是的,我尝试调整搜索时间)。

这是我的批量索引 json 的样子:

{'index': 
         {'_timestamp': u'2015-08-11 14:18:26', 
          '_type': 'webapp_fingerprint', 
          '_id': u'webapp_id_redacted_2015_08_13_12_39_34',
          '_index': 'webapp_index'
         }
}

****JSON DATA HERE***

这将被 elasticsearch 接受并被导入 Kibana,但 _timestamp 字段实际上不会被索引(在“时间字段名称”下配置索引模式时,它确实显示在下拉列表中)。

我还尝试像这样格式化元字段:

{'index': {
           '_type': 'webapp_fingerprint', 
           '_id': u'webapp_id_redacted_2015_08_13_12_50_04', 
           '_index': 'webapp_index'
          }, 
           'source': {
                      '_timestamp': {
                                     'path': u'2015-08-11 14:18:26',
                                     'enabled': True, 
                                     'format': 'YYYY-MM-DD HH:mm:ss'
                                    }
                     }
}

这也行不通。

最后,我尝试在索引中包含 _timestamp 字段并应用格式,但我在使用 elasticsearch 时遇到错误。

{'index': {
           '_timestamp': {
                          'path': u'2015-08-11 14:18:26', 
                          'enabled': True, 
                          'format': 'YYYY-MM-DD HH:mm:ss'
                         }, 
           '_type': 'webapp_fingerprint', 
           '_id': u'webapp_id_redacted_2015_08_13_12_55_53', 
           '_index': 'webapp_index'
          }
}

错误是:

elasticsearch.exceptions.TransportError: 
TransportError(500,u'IllegalArgumentException[Malformed action/metadata 
line [1], expected a simple value for field [_timestamp] but found [START_OBJECT]]')

任何人可以提供的帮助将不胜感激。如果我没有很好地解释这个问题,我深表歉意。如果我需要澄清更多,请告诉我。谢谢。

4

2 回答 2

7

修复了我自己的问题。基本上,我需要在创建索引时为时间戳添加映射。

request_body = {
    "settings" : {
        "number_of_shards": 1,
        "number_of_replicas": 0
    },
    "mappings" : {
        "_default_":{
            "_timestamp":{
                 "enabled":"true",
                 "store":"true",
                 "path":"plugins.time_stamp.string",
                 "format":"yyyy-MM-dd HH:m:ss"
             }
         }
    }
}
print("creating '%s' index..." % (index_name))
res = es.indices.create(index = index_name, body = request_body)
print(" response: '%s'" % (res))
于 2015-08-14T13:28:04.427 回答
2

在最新版本的 Elasticsearch 中,只需使用 PUT/POST API 和 ISOFORMAT 字符串即可。

import datetime
import requests 

query = json.dumps(
{
 "createdAt": datetime.datetime.now().replace(microsecond=0).isoformat(),
}
)
response = requests.post("https://search-XYZ.com/your-index/log", data=query,
               headers={'Content-Type': 'application/json'})
print(response)
于 2020-05-05T15:18:00.193 回答