Я изучаю elasticssearch, и в одной из предоставленных мне демонстрационных баз данных у меня есть поле даты и времени, сохраненное с именем time_stamp. Данные даты сохраняются в виде текста:
"time_stamp":"13-06-2019 04:44:23"
Я хочу создать новое поле данных под названием «дата» и извлечь только дату из каждого документа и сохранить ее в том же документе. Текущее отображение индекса выглядит следующим образом:
{
"vp1": {
"mappings": {
"dynamic": "false",
"properties": {
"client_id": {
"type": "text"
},
"encod": {
"type": "float"
},
"imagename": {
"type": "text"
},
"indx": {
"type": "text"
},
"machid": {
"type": "text"
},
"matchid": {
"type": "float"
},
"sequence_id": {
"type": "integer"
},
"time_stamp": {
"type": "text"
}
}
}
}
}
Я использую python3 для взаимодействия с индексом.
Сначала вам нужно обновить сопоставление, чтобы добавить новое поле, поскольку для параметра dynamic установлено значение false, новое поле не может быть создано автоматически:
PUT vp1/_mapping
{
"properties": {
"date": {
"type": "date"
}
}
}
Затем простой способ добиться того, чего вы хотите, - сделать это следующим образом:
POST vp1/_update_by_query
{
"script": {
"source": "ctx._source.date = /\\s/.split(ctx._source.time_stamp)[0]"
}
}
К сожалению, попробуйте еще раз, я пропустил один escape-символ
еще раз спасибо ... когда я запустил код, я получил эту ошибку "cause":{"type":"mapper_parsing_exception","reason":"object mapping for [date] tried to parse field [date] as object, but found a concrete value"},"status":400}]}
Это означает, что у вас уже есть поле с именем date в вашем индексе. Можете ли вы показать, что вы получаете от curl -XGET localhost:9200/vp1, а также версию ES, которую вы используете?
я думаю, что я сделал ошибку, вывод: {"vp1":{"aliases":{},"mappings":{"dynamic":"false","properties":{"client_id":{"type":"text"},"date":{"properties":{"date":{"type":"date"}}},"encod":{"type":"float"},"imagename":{"type":"text"},"indx":{"type":"text"},"machid":{"type":"text"},"matchid":{"type":"float"},"sequence_id":{"type":"integer"},"time_stamp":{"type":"text"}}},"settings":{"index":{"number_of_shards":"5","provided_name":"vp1","max_result_window":"100000","creation_date":"1561486804831","number_of_replicas":"1","uuid":"-7f7GBFFTB2ACbxupXj-kQ","version":{"created":"7010199"}}}}}
@val... я думаю, что допустил ошибку при добавлении поля даты
Да, ваше поле даты действительно неверно. Либо создайте другое поле правильно, либо переиндексируйте свои данные
нет... я попал в еще больший беспорядок с elasticsearch, так как я больше работаю.... вроде переделываю весь анализ... буду держать вас в курсе
Спасибо за ваш ответ. Мне потребовалось время, чтобы ответить, так как мне пришлось воссоздать всю настройку из-за многочисленных пробелов, которые у меня были между ES и моими данными.
Круто, рад, что помогло!
большое спасибо... когда я вставляю приведенный выше код в кибану, я получаю сообщение об ошибке
bad string. Я запустил код с терминала как CURL и получил ошибкуerror":{"root_cause":[{"type":"json_parse_exception","reason":"Unrecognized character escape 's' (code 115)\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@772237c8; line: 4, column: 38]"}],"type":"json_parse_exception","reason":"Unrecognized character escape 's' (code 115)\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@772237c8; line: 4, column: 38]"},"status":500}