Как указать длинное значение пользователя в качестве типа «Дата» в Elasticsearch?

#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.