Массовое внедрение документа в эластичный поиск с отметкой времени в наносекундах

Я пытаюсь использовать последнюю поддержку наносекунд, предоставляемую 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» автоматически сопоставляется с типом даты Elasticsearch до версии 7.0.

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

Теперь я хочу сопоставить поле отметки времени с типом date_nanos. С здесь, я думаю, мне нужно создать Индекс ES с правильным отображением, прежде чем я вызову функцию es_bulk_insert () для загрузки документов.

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 не поддерживает поиск наносекунд до 7.3 Не уверен, правильно ли можно сортировать по наносекундам, попробую.

Спасибо!


person Whispererli    schedule 23.08.2019    source источник


Ответы (1)


Вы правы: для date_nanos вам нужно создать сопоставление явно - иначе динамическое сопоставление вернется к date.

И вы также правы, что Kibana поддерживает date_nanos в 7.3; хотя соответствующий билет IMO https://github.com/elastic/kibana/issues/31424 < / а>.

Однако сортировка пока работает некорректно. Это потому, что и date (точность до миллисекунды), и date_nanos (точность до наносекунды) представлены как долгое время с начала эпохи. Таким образом, первый будет иметь значение 1546344630124, а второй - 1546344630123456789 - это не дает ожидаемого порядка сортировки.

В Elasticsearch есть параметр для поиска "numeric_type": "date_nanos", который приведет как к наносекундной точности, так и, следовательно, к правильному порядку (добавлено в 7.2). Однако этот параметр еще не используется в Kibana. Я сейчас поднял вопрос.

Для повышения производительности: в публикации блога о выпуске есть некоторые подробности. Очевидно, что есть накладные расходы (включая размер документа), поэтому я бы использовал более высокую точность, только если она вам действительно нужна.

person xeraa    schedule 25.08.2019
comment
Спасибо за интересный вопрос. Теперь я превратил его в сообщение в блоге с некоторой дополнительной информацией по этому поводу, так как вижу, что вопрос снова возникает: xeraa.net/blog/2019_date-nano-elasticsearch-kibana - person xeraa; 26.08.2019