#elasticsearch
Вопрос:
Я использую Elasticsearch 7.10.1. В моем документе есть поле timestamp
, значение которого длинное, например 1624841520000
. Я попытался изменить его на Date
тип использования, но не смог:
PUT myindex/_mapping
{
"properties": {
"timestamp": {
"type": "date"
}
}
}
Ответ на ошибку таков:
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "mapper [timestamp] cannot be changed from type [long] to [date]"
}
],
"type" : "illegal_argument_exception",
"reason" : "mapper [timestamp] cannot be changed from type [long] to [date]"
},
"status" : 400
}
Как я могу использовать это поле в качестве date
?
Ответ №1:
Вы не можете изменить тип сопоставления, вам нужно будет удалить индекс и создать сопоставление перед индексированием документа.
Более поздние версии, начиная с 7.11, использующие лицензию Elastic, имеют возможность создавать поля времени выполнения, что позволяет изменять сопоставление во время запроса, но это невозможно в версии 7.10.
Комментарии:
1. Означает ли это, что я могу использовать
date
тип дляlong
значения при создании нового индекса?2. Нет, в версии 7.10, если у вас есть поле, сопоставленное до тех пор, пока вы не можете использовать его в качестве даты, вам нужно удалить индекс, сопоставить поле как дату, а затем повторно выполнить индексацию. Начиная с версии 7.11 у вас есть возможность использовать другое сопоставление только во время запроса, оно не изменит исходное сопоставление, но позволит вам запросить поле с эпохальным временем в качестве даты, даже если оно сопоставлено, например, так долго. Также, если вы хотите использовать поле в качестве даты в Кибане, например, при создании шаблона индекса, вам необходимо отобразить его как поле даты.
Ответ №2:
Создание или обновление, подобное этому, должно решить вашу проблему:
PUT myindex/_doc/<the_doc_id_of_your_data>
{
"data_field": "data_value",
"timestamp": 1626336886075
}
Где <the_doc_id_of_your_data> должен быть заменен указанным вами идентификатором документа.
Обратите внимание, что существует _doc
ложь между вашим именем индекса и идентификатором doc_id.
Тип поля даты документ говорит date
, что тип принимает значение в миллисекундах с момента начала эпохи в качестве входных данных. Причина, по которой вы все еще получили эту ошибку, может заключаться в том, что, согласно документу API индекса, вы должны использовать одну из следующих форм параметра path:
PUT /<target>/_doc/<_id>
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
И вы, возможно, просто пропустили параметр path.