批量注入doc以使用纳秒级时间戳进行弹性搜索

时间:2019-08-23 17:09:32

标签: elasticsearch kibana aws-elasticsearch

我正在尝试使用ElasticSearch 7.1(实际上是7.0之后)提供的最新纳秒支持。不确定如何正确执行此操作。

在7.0之前,ElasticSearch仅支持时间戳毫秒级,我使用_bulk API注入文档。

#bulk post docs to elastic search
def es_bulk_insert(log_lines, batch_size=1000):
   headers = {'Content-Type': 'application/x-ndjson'}
   while log_lines:
       batch, log_lines = log_lines[:batch_size], log_lines[batch_size:]
       batch = '\n'.join([x.es_post_payload for x in batch]) + '\n'
       request = AWSRequest(method='POST', url=f'{ES_HOST}/_bulk', data=batch, headers=headers)
       SigV4Auth(boto3.Session().get_credentials(), 'es', 'eu-west-1').add_auth(request)
       session = URLLib3Session()
       r = session.send(request.prepare())
       if r.status_code > 299:
           raise Exception(f'Received a bad response from Elasticsearch: {r.text}')

每天都会生成日志索引

#ex:
#log-20190804
#log-20190805
def es_index(self):
       current_date = datetime.strftime(datetime.now(), '%Y%m%d')
       return f'{self.name}-{current_date}'

时间戳以纳秒为单位“ 2019-08-07T23:59:01.193379911Z”,并且它会在7.0之前由Elasticsearch自动映射到日期类型。

"timestamp": {
    "type": "date"
},

现在,我想将时间戳字段映射到“ date_nanos”类型。从here开始,我认为在调用es_bulk_insert()函数上传文档之前,需要使用正确的映射创建ES索引。

GET https://{es_url}/log-20190823
If not exist (return 404)
PUT https://{es_url}/log-20190823/_mapping
{
 "properties": {
    "timestamp": {
      "type": "date_nanos" 
    }
  }
}
...
call es_bulk_insert()
...

我的问题是:
1.如果我不重新映射旧数据(例如:log-20190804),那么时间戳将具有两个映射(data vs data_nano),当我使用Kibana搜索日志时会发生冲突吗?
2.我没有看到太多有关使用此新功能的文章,这会严重影响性能吗?有人在产品中使用它吗?
3. Kibana not support nanoseconds search before 7.3不确定是否可以正确地按纳秒排序,将尝试。

谢谢!

1 个答案:

答案 0 :(得分:2)

您是对的:对于date_nanos,您需要显式创建映射-否则动态映射将退回到date

您还正确地认为Kibana在7.3中通常支持date_nanos;尽管相关票证是IMO https://github.com/elastic/kibana/issues/31424

但是,排序尚未正确进行。这是因为date(毫秒精度)和date_nanos(纳秒精度)都被表示为距Epoche开始已经很久了。因此,第一个将具有1546344630124的值,第二个将具有1546344630123456789的值-这没有给您期望的排序顺序。

在Elasticsearch中,有一个parameter用于搜索"numeric_type": "date_nanos",它将转换为纳秒精度,从而正确排序(在7.2中添加)。但是,该参数尚未在Kibana中使用。我有raised an issue for that now

为了提高性能:release blog post has some details。显然会有开销(包括文档大小),所以只有在您真正需要时才使用更高的精度。