Объект Elasticsearch datetime в rails неправильно гидратирован из индекса, читается как строка

#ruby-on-rails #ruby #search #elasticsearch #elasticsearch-rails

#ruby-on-rails #ruby #Поиск #elasticsearch #elasticsearch-rails

Вопрос:

У меня есть индексированное поле, определенное как, :date это метод определения того, какой DateTime объект хранить.

 settings index: { number_of_shards: 1 } do
    mapping do
      ...
      indexes :date,            index: :not_analyzed, type: 'date'
      ...
    end
end
  

И в моем as_indexed_json У меня он указан в :methods

 def as_indexed_json(options = {})
  self.as_json(
    ...
    methods: [:full_text, :tag_list, :category_list, :date, :month, :year],
    ...
  )
end
  

Он правильно индексирует желаемое значение как "date": "2016-05-19T09:43:09-04:00" но когда я считываю значение после поиска, дата возвращается как класс String вместо любого из классов date.

Я поработал с некоторыми из доступных format значений в этом поле, таких как date_time_no_millis , strict_ date_time_no_millis и "yyyy-MM-dd'T'HH:mm:ssZ" , но, похоже, это только корректирует настройку и понимание значения, а не их чтение и гидратацию по классам.

Как я могу заставить это date значение считываться обратно как Rails DateTime , поскольку оно существует в моей базе данных?

Ранее публиковался как проблема с Github без ответа.

Ответ №1:

Вы спрашиваете, как преобразовать строку в значение datetime в Rails?

> "2016-05-19T09:43:09-04:00".to_datetime
=> Thu, 19 May 2016 09:43:09 -0400

Комментарии:

1. Нет, я спрашиваю, почему это еще не сделано elasticsearch-rails

Ответ №2:

Если я правильно понимаю вопрос, вам нужно будет преобразовать поле даты из String в DateTime только в вашем приложении ruby.

Elasticsearch хранит _source как JSON, а у JSON нет типа данных date, поэтому вам пришлось бы вызывать метод для строки, который преобразует его обратно в datetime. Вы могли бы обратиться к документации, чтобы увидеть, как даты хранятся в ES.

Комментарии:

1. Все остальные объекты преобразуются в соответствующие им объекты rails. Строка, хэши и т.д… Мое приложение Rails знает, как сопоставить значения с индексом с помощью elasticsearch-rails, предполагается, что оно также знает, как сопоставить обратно, но это не так