2016-12-13 2 views
2

Вопрос. Мне поручено исследовать, как заполнять данные в Elasticsearch. До сих пор немного пуст. Основной смысл:Elasticsearch заполняет два поля в одно новое поле после расчетов

Примечания: Все документы хранятся под ежедневными индексами с ~ 200 тыс. Документов в день.

  • Мне нужно иметь возможность переиндексации данных за 60 дней.
  • Мне нужно взять два поля для каждого документа payload.time_sec и payload.time_nanosec, взять там значения и выполнить некоторую математику (time_sec * 10 ** 9 + time_nanosec), а затем вернуть это как одно поле в reindexed документ

Я смотрю на API документации Python с объемными помощниками: http://elasticsearch-py.readthedocs.io/en/master/helpers.html

Но мне интересно, если это вообще возможно.

Мои мысли должны были использовать: Массовые помощники, чтобы вытащить идентификатор прокрутки (массив _update?), Перебирать каждый идентификатор документа, извлекать эти данные из двух полей для каждой док-станции, выполнять математику и завершать обновление запрос с новыми данными поля.

Кто-нибудь это сделал? Может, что-то с серьезным сценарием?

Спасибо!

ответ

1

Объемные помощникам вытащить ID прокрутки (насыпной _update?), Перебирать каждый Идентификатор документа, тянуть, что данные из двух полей для каждого дока, сделать математику, и завершить запрос на обновление с новым полем данные.

В принципе, да:

  • использование /_search?scroll для извлечения документации
  • выполнить операцию
  • отправить /_bulk запросы на обновление

Другие варианты:

И поддержка сценариев, которые, если я правильно понял, пустошь быть идеальным выбором, потому что ваше обновление не зависят от внешних факторов, поэтому это может быть сделано непосредственно на сервере.

+0

Ive использовал python для работы по этой проблеме до сих пор, опубликует фрагменты кода в новом ответе – fastfiveoh

+0

@fastfiveoh, какое решение вы решите наконец? Я встречаю подобную проблему и задаюсь вопросом, какой путь лучший. –

+0

@RobinWang Я, наконец, просто написал сценарий, вы можете увидеть его в моем репо: [link] https://github.com/fastfiveoh/python-es-reindex/blob/master/backfill_data – fastfiveoh

0

Вот где я нахожусь (примерно):

Ive работает с Python и объемными хелперов и до сих пор нахожусь здесь:

doc = helpers.scan(es, query={ 
"query": { 
"match_all": {} 

}, 
"size":1000 
},index=INDEX, scroll='5m', raise_on_error=False) 


    for x in doc: 
x['_index'] = NEW_INDEX 
try: 
    time_sec = x['_source']['payload']['time_sec'] 
    time_nanosec=x['_source']['payload']['time_nanosec'] 
    duration = (time_sec * 10**9) + time_nanosec 
except KeyError: pass 

count = count + 1 

x['_source']['payload']['duration'] = duration 
new_index_data.append(x) 

helpers.bulk(es,new_index_data) 

Отсюда я просто используя основную помощник python для вставки в новый индекс. Однако я буду экспериментировать с изменением и тестированием с массовым обновлением до существующего индекса.

Это похоже на правильный подход?

+0

также причина, по которой я перехожу к новый индекс, затем удалит старый индекс и укажет псевдоним на новый индекс, чтобы принять новый шаблон сопоставления. – fastfiveoh

+0

Звучит еще более подходящим для использования API '_reindex' – mark

+0

Я не думал, что reindex будет хорошо. Я проверяю целостность данных, возвращаюсь на 3 месяца, закладывая около 6 - 8 новых полей. – fastfiveoh

Смежные вопросы