Получение полей документа ElasticSearch внутри загруженных записей в searchkick - PullRequest
0 голосов
/ 05 ноября 2019

Можно ли получить поля документа ElasticSearch внутри загруженных записей AR?

Вот суть, иллюстрирующая, что я имею в виду: https://gist.github.com/allomov/39c30905e94c646fb11637b45f43445d

В этом случае я хочу избежать дополнительныхвычисление total_price после получения ответа от ES. Решение, которое я сейчас вижу, состоит в том, чтобы включить отношение и выполнить total_price вычисление для каждой записи, что, на мой взгляд, не столь оптимальный способ выполнения этой операции.

result = Product.search("test", includes: :product_components).response
products_with_total_prices = result.map do |product|
  {
    product: product
    total_price: product.product_components.map(&:price).compact.sum
  }
end

Не могли бы вы сказатьможно ли смешивать поля документа ES в AR загруженной записи?

1 Ответ

0 голосов
/ 06 ноября 2019

Насколько я знаю, невозможно получить ответ, который объединяет поля документа с загруженной записью.

Обычно я предпочитаю полностью полагаться на данные в проиндексированном документе, где это возможно. (используя load: false в качестве опции поиска) и загружайте записи AR только в качестве второго шага, если это необходимо. Например:

result = Product.search("test", load: false).response

# If you also need AR records, could do something like:
product_ids    = result.map(&:id)
products_by_id = {}

Product.where(id: product_ids).find_each do |ar_product|
  products_by_id[ar_product.id] = ar_product
end

merged_result = result.map do |es_product|
  es_product[:ar_product] = products_by_id[es_product.id]}
end

Кроме того, может быть полезно извлечь документ, сохраненный в индексе ES для конкретной записи, что я обычно делал бы, определяя следующий метод в вашем классе Product:

def es_document
  return nil unless doc = Product.search_index.retrieve(self).presence
  Hashie::Mash.new doc
end
...