2012-11-30 4 views
5

Ich verwende Tire und elasticsearch, um Suchfunktionen für ein MongoMapper-Modell bereitzustellen, das Teil einer Rails App ist. Ich stolperte über ein Problem, wo die Zuordnungen für dieses Modell nicht aktualisiert wurden, wenn ich in eine Umgebung umgeschichtet, die die folgende Konfiguration verwendet (in config/Umgebungen/env_name.rb):Nachladen von Reifen-/Elasticsearch-Zuordnungen für ein Modell, das bereits Daten gespeichert hat

config.cache_classes = true 

die Klasse allein didn Nachladen scheint das Problem nicht zu beheben (vielleicht sind die neuen Mappings vielleicht nicht inkompatibel mit vorhandenen Daten, denke ich?). stattdessen musste ich Folgendes tun:

MyModel.index.delete 
<restart the app or reload the class> 
MyModel.index.import MyModel.all 

Ich fragte mich nur, ob es einen besseren Weg von a) gibt. Sicherstellen, dass die neuesten in meinem Modellcode definierten Zuordnungen nach jeder Bereitstellung von elasticsearch verwendet werden, aber b). Vermeiden Sie unnötige Repopulation des Index mit dem vollständigen Datensatz?

Wir verwenden normalerweise Chef, damit ich die drei Schritte automatisieren konnte, die ich erfolgreich ohne zu viel Mühe verwendete. Aber ich bin neu in Elasticsearch und Reifen, also dachte ich, dass es sehr wahrscheinlich ist, dass ich beides missbrauche oder Dinge unnötig schwierig mache.

Antwort

5

paar Punkte hier:

  • Reifen versucht, den Index mit der richtigen Zuordnung, wenn die Klasse Lasten
  • aber Reifen tut nicht Versuch zu schaffen Erstellen Sie den Index für das Modell, wenn es bereits vorhanden ist

Also, deine Frage ist wirklich mehr über den richtigen Workflow? Wenn Sie eine neue Version der Anwendung bereitstellen, sollten Sie den Index nicht erneut auffüllen, genauso wie Sie die Datenbank nicht aus einer Art von Sicherung neu auffüllen.

Automatisch nach Indexabbildungen zu suchen, die der aktuellen Definition im Modell entsprechen, ist sicherlich möglich (vergleiche die MyModel.tire.index.mapping mit MyModel.tire.mapping, wieder füllen, wenn unterschiedlich, usw.), etwas, das ich vorsichtig wäre.

Der Entwickler weiß normalerweise, wann sie das Mapping geändert hat und sollte die Daten neu indizieren. Das Löschen des Indexes und das erneute Auffüllen bedeutet auch Suchausfallzeiten und ist für große Anwendungen nicht möglich.

Eine bessere Lösung besteht darin, beim Importieren der Daten einen bestimmten Indexnamen wie my-index-2012-12 zu verwenden und auf diesen Index einen my-index Alias ​​zu zeigen. Dann können Sie den Index frei auffüllen und den Alias ​​nach Bedarf ohne Ausfallzeit umdrehen. Tyre ist bemüht, Sie bei dieser Art von Arbeitsablauf (der Rake-Import-Task usw.) zu unterstützen.

+0

Ich war ein wenig verwirrt von Ihrem letzten Absatz, ich verstehe nicht, wie Sie einen Alias ​​zu einem anderen Index verwenden können, um die Innenstadt zu vermeiden. In dem von Ihnen beschriebenen Szenario Wird nicht gegen my-index gesucht, sondern nur gegen my-index-2012-12, während es neu indiziert wird? – concept47

+0

Danke für die Details Antwort. Ich werde das als richtig bezeichnen, da ich keine Alternative finden kann. Es scheint als wäre die Antwort der Antwort, dass Sie die Daten in meinem Szenario neu indizieren müssen, und Sie können elasticsearch-Aliase verwenden, um Ausfallzeiten in diesem Szenario zu vermeiden.Hier ist der Link mit weiteren Informationen zu elasticsearch-Aliasen: http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html Die Reifengithub-Seite verlinkt nun dazu und hat Informationen zu Indexaliasen – willjthomas

+0

@ concept47 wie auf der Reifengithub-Seite jetzt: Sie können Ihre Daten in einen neuen Index indizieren (und möglicherweise einen Alias ​​aktualisieren, sobald alles in Ordnung ist). Sie erstellen den vorhandenen Index also nicht neu, sondern erstellen eine neue Version und spiegeln dann den Alias. Bitte korrigieren Sie mich, wenn ich falsch liege – willjthomas

0

können Sie versuchen, diese Update elasticsearch settings via Tire

+1

refresh_interval legt die Häufigkeit fest, mit der Sie die Daten im Index aktualisieren, nicht wahr? Das Problem, das ich habe, ist die Aktualisierung der Index-Mappings nicht die gespeicherten Daten – willjthomas

Verwandte Themen