2012-11-30 14 views
5

Korzystam z funkcji Tyre i elasticsearch, aby zapewnić funkcję wyszukiwania w modelu MongoMapper, który jest częścią aplikacji Rails. Właśnie natknął się na problem gdzie mapowania dla tego modelu nie były aktualizowane, kiedy przesunięte do środowiska, które wykorzystuje następującą konfigurację (w config/Środowiska/env_name.rb):Ponowne ładowanie opon/mapowania elastycznego przeszukiwania dla modelu, który już ma przechowywane dane

config.cache_classes = true 

przeładowywania klasy sam nie zrobił Wydaje się, że naprawia problem (być może zrozumiałe, że nowe mapowania mogą nie być niekompatybilne z istniejącymi danymi?). zamiast tego musiałem wykonać następujące czynności:

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

Po prostu zastanawiałem się, czy istnieje lepszy sposób na). zapewniając, że najnowsze mapowania zdefiniowane w kodzie modelu będą używane przez elastyczne wyszukiwanie po każdym wdrożeniu, ale b). unikanie niepotrzebnego ponownego indeksowania indeksu za pomocą kompletnego zestawu danych?

Zwykle wdrażamy za pomocą Chefa, więc mogłem zautomatyzować trzy kroki, które z powodzeniem zastosowałem bez większych problemów. Ale jestem nowicjuszem w zakresie elastycznego wyszukiwania i opon, więc pomyślałem, że bardzo prawdopodobne jest to, że niewłaściwie wykorzystuję oba elementy lub niepotrzebnie utrudniam pracę.

Odpowiedz

5

kilka punktów tutaj:

  • opon próbuje utworzyć indeks z prawidłowym odwzorowaniu po załadowaniu klasy
  • ale Tire dokłada nie próbę utwórz indeks dla modelu, gdy już istnieje.

Twoje pytanie dotyczy zatem prawidłowego przepływu pracy? Po wdrożeniu nowej wersji aplikacji nie należy ponownie wypełniać indeksu w taki sam sposób, w jaki nie ponownie wypełnia się bazę danych z pewnego rodzaju kopii zapasowej.

Automatyczne sprawdzanie odwzorowań indeksu zgodne z bieżącą definicją w modelu jest z pewnością możliwe (porównaj MyModel.tire.index.mapping z MyModel.tire.mapping, ponownie wypełnij, jeśli jest inny, itp.), Jest to coś, czego bym się nie bał.

Deweloper zwykle wie, kiedy zmieniła mapowanie i powinna ponownie zindeksować dane. Upuszczenie indeksu i ponowne zapełnienie oznacza także przestój w wyszukiwaniu, a nawet nie jest możliwe w przypadku dużych aplikacji.

Lepszym rozwiązaniem jest użycie konkretnej nazwy indeksu, takiej jak my-index-2012-12 podczas importowania danych, i wskazanie aliasu my-index dla tego indeksu. Następnie możesz dowolnie ponownie wypełnić indeks i odwrócić alias, gdy skończysz, bez przestojów. Tyre stara się wspierać Cię w tego rodzaju workflow (zadanie importu prowizji itp.).

+0

Byłem trochę zdezorientowany ostatnim akapitem, nie rozumiem, jak można użyć aliasu do innego indeksu, aby uniknąć śródmieścia. W scenariuszu, który opisałeś Nie przeszukuje mojego indeksu po prostu uruchamia się na mój-index-2012-12 podczas jego ponownego indeksowania? – concept47

+0

Dzięki za odpowiedź na szczegóły. Zaznaczę to jako poprawne, ponieważ nie mogę znaleźć alternatywy. Wygląda na to, że odpowiedź brzmi: musisz ponownie zindeksować dane w moim scenariuszu i możesz użyć elastycznych aliasów, aby uniknąć przestojów w tym scenariuszu.Oto link z dodatkowymi informacjami na temat aliasów elasticsearch: http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html Strona github dla opon teraz łączy się z tym i zawiera informacje na temat aliasów indeksu – willjthomas

+0

@ concept47 jak na stronie github opony teraz: możesz indeksować swoje dane do nowego indeksu (i ewentualnie zaktualizować alias, gdy wszystko będzie dobrze). Więc nie tworzysz ponownie istniejącego indeksu, tworzysz nową wersję, a następnie odwracasz alias. Proszę mnie poprawić, jeśli się mylę. – willjthomas