Searchkick 3.1.0-t használok
Tömegesen indexelnem kell egy bizonyos rekordgyűjteményt. A dokumentumokban olvasottak és kipróbálások alapján nem tudok előre meghatározott azonosítószámot átadni a Searchkick újraindexelési metódusának. Aszinkron módot használok.
Ha például a Klass.reindex(async: true), akkor sorba állítja a feladatokat a beállításokban megadott batch_size értékkel. Az a probléma, hogy a teljes modell azonosítóját végighurcolja, majd meghatározza, hogy indexelni kell-e őket. Például, ha 10 000 rekord van az adatbázisomban, és a kötegméret 200, akkor 50 feladatot helyez sorba. Ezután minden azonosítóra ciklust fog végezni, és ha a search_import feltételei teljesülnek, indexeli azokat.
Ez a lépés haszontalan, szeretném sorba helyezni az azonosítók előre szűrt tömbjét, hogy megakadályozzam a teljes rekordon való hurkolást.
Megpróbáltam megírni a következő feladatot, hogy felülírjam a normál viselkedést:
def perform(class_name, batch_size = 100, offset = 0)
model = class_name.constantize
ids = model
.joins(:user)
.where(user: { active: true, id: $rollout.get(:searchkick).users })
.where("#{class_name.downcase.pluralize}.id > ?", offset)
.pluck(:id)
until ids.empty?
ids_to_enqueue = ids.shift(batch_size)
Searchkick::BulkReindexJob.perform_later(
class_name: model.name,
record_ids: ids_to_enqueue
)
end
A probléma: A keresési leképezési beállításokat a rendszer teljesen figyelmen kívül hagyja, amikor rekordokat szúr be az ElasticSearch-be, és nem tudok rájönni, hogy miért. Nem veszi fel a megadott egyezést (text_middle), és nem hoz létre hozzárendelést az alapértelmezett "kulcsszó" egyezéssel.
Van valami tiszta módszer a rekordok tömeges újraindexelésére anélkül, hogy sorba kellene helyezni a nem kívánt rekordokat tartalmazó feladatokat?