Elasticsearch - как извлечь дату из поля даты и времени и добавить ее в каждый документ как новое поле

Я изучаю 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 для взаимодействия с индексом.

1
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вам нужно обновить сопоставление, чтобы добавить новое поле, поскольку для параметра 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]"
  }
}

большое спасибо... когда я вставляю приведенный выше код в кибану, я получаю сообщение об ошибке 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@772237‌​c8; line: 4, column: 38]"}],"type":"json_parse_exception","reason":"Unrecognized character escape 's' (code 115)\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@772237‌​c8; line: 4, column: 38]"},"status":500}

Apricot 26.06.2019 11:05

К сожалению, попробуйте еще раз, я пропустил один escape-символ

Val 26.06.2019 11:05

еще раз спасибо ... когда я запустил код, я получил эту ошибку "cause":{"type":"mapper_parsing_exception","reason":"object mapping for [date] tried to parse field [date] as object, but found a concrete value"},"status":400}]}

Apricot 26.06.2019 13:02

Это означает, что у вас уже есть поле с именем date в вашем индексе. Можете ли вы показать, что вы получаете от curl -XGET localhost:9200/vp1, а также версию ES, которую вы используете?

Val 26.06.2019 13:12

я думаю, что я сделал ошибку, вывод: {"vp1":{"aliases":{},"mappings":{"dynamic":"false","properti‌​es":{"client_id":{"t‌​ype":"text"},"date":‌​{"properties":{"date‌​":{"type":"date"}}},‌​"encod":{"type":"flo‌​at"},"imagename":{"t‌​ype":"text"},"indx":‌​{"type":"text"},"mac‌​hid":{"type":"text"}‌​,"matchid":{"type":"‌​float"},"sequence_id‌​":{"type":"integer"}‌​,"time_stamp":{"type‌​":"text"}}},"setting‌​s":{"index":{"number‌​_of_shards":"5","pro‌​vided_name":"vp1","m‌​ax_result_window":"1‌​00000","creation_dat‌​e":"1561486804831","‌​number_of_replicas":‌​"1","uuid":"-7f7GBFF‌​TB2ACbxupXj-kQ","ver‌​sion":{"created":"70‌​10199"}}}}}

Apricot 26.06.2019 13:43

@val... я думаю, что допустил ошибку при добавлении поля даты

Apricot 26.06.2019 13:43

Да, ваше поле даты действительно неверно. Либо создайте другое поле правильно, либо переиндексируйте свои данные

Val 26.06.2019 13:44

нет... я попал в еще больший беспорядок с elasticsearch, так как я больше работаю.... вроде переделываю весь анализ... буду держать вас в курсе

Apricot 27.06.2019 09:27

Спасибо за ваш ответ. Мне потребовалось время, чтобы ответить, так как мне пришлось воссоздать всю настройку из-за многочисленных пробелов, которые у меня были между ES и моими данными.

Apricot 04.07.2019 06:26

Круто, рад, что помогло!

Val 08.07.2019 09:00

Другие вопросы по теме