2016-05-30 5 views
1

Я использую Searchkick для взаимодействия с эластичным поиском api в приложении Rails, и он работает нормально почти для всех случаев, но проблема, с которой я столкнулся, - у меня есть поле статуса в моей модели , а также при помощи флажка «Выбрать все» пользователь может изменить статус всех записей, поэтому я обновляю свои данные с помощью update_all, который не запускает обратный вызов и выполняет поиск данных reindex с помощью обратного вызова after_commit. и поскольку, мои данные не получают reindexed в Elastic Search таким образом, он дает те же результаты, что я должен делать, вызывает Model.reindex вручную - это хороший вариант?Rails Elastic Search reindex data after update_all

ответ

3

я на самом деле решил ее, без повторной индексации всей информации, которая была бы действительно наивным решением, вместо того, что мы можем повторно индексировать одну запись, как ниже

product = Product.find 10 
product.reindex 
# or to reindex in the background 
product.reindex_async 
1

Вы должны позвонить по телефону Model.reindex вручную. action_all предназначен для непосредственного внесения изменений на уровне БД. Подробнее here.

Вы можете создать фильтр after_action для переиндексации данных.

+0

Это ОКК, чтобы сделать это на местном I попробовал, но разве это не создаст проблему на производстве, у нас есть 50к + записи на производстве, переиндексация 50 тыс. записей может занять достойное время? –

+0

Да, вам потребуется время, которое вы также можете назвать этим переиндексисом в фоновом режиме. Создайте фоновое задание только для reindex. И назовите его в 'afetr_action'. –

+0

Вы можете сделать это так же 'models.find_each {| m | m.update_attributes (params)} 'Это займет больше времени. Поскольку update и reindex будут вызывать количество записей. –