Co jakiś czas, w pracy z Solr pojawia się problem – aktualizacja struktury indeksów Solr. Różne są powody tych zmian – nowe wymagania funkcjonalne, optymalizacje, czy cokolwiek innego – nie jest to ważne. Istotne jest pytanie, które się wtedy pojawia – usuwać indeks, czy po prostu zmienić strukturę i przeprowadzić pełną indeksację ? Wbrew pozorom odpowiedź na to pytanie zależy od zmian, jakich dokonaliśmy w strukturze indeksu.
Osobiście, jestem zwolennikiem rozwiązań, które mają jak najmniejszą szansę powodować problemy – po prostu lubię w nocy spać. Do takich rozwiązań zaliczam usunięcie indeksu po modyfikacji jego struktury, a następnie pełną indeksację danych. Zdaję sobie jednak sprawę, że nie zawsze takie rozwiązanie jest akceptowalne. Kiedy zatem nie jesteśmy zmuszeni do usunięcia indeksu, a kiedy nie usunięcie indeksu naraża nas na ewentualne problemy z poprawnym działaniem Solr ?
Odpowiedź na pytanie zależy od tego, co zmieniliśmy w strukturze indeksu. Zmiany takie, można podzielić na trzy obszary obejmujące większość ze zmian jakie możemy dokonać w strukturze indeksu:
- Dodanie/usunięcie nowego pola
- Modyfikacja podobieństwa (Similarity)
- Modyfikacja typu pola
Dodanie/usunięcie nowego pola
W przypadku pierwszego typu modyfikacji sprawa jest dość prosta – jeżeli dodamy do schema.xml (bądź usuniemy) nowe pole, nie ma konieczności usuwania całego indeksu przed ponowną indeksacją. Solr poradzi sobie z dodaniem nowego pola, do aktualnego indeksu. Oczywiście, należy sobie zdawać sprawę, iż dokumenty, które nie będą po tej operacji ponownie zaindeksowane nie będą automatycznie uaktualnione.
Modyfikacja podobieństwa
W drugim przypadku, czyli przy ewentualnej zmianie klasy odpowiedzialnej za Similarity także nie musimy usuwać indeksu po zmianie schema.xml. Jednak w odróżnieniu od poprzedniego przykładu, do poprawnego wyliczania współczynnika score, a tym samym do poprawnego sortowania będzie konieczna ponowna indeksacja wszystkich dokumentów wcześniej obecnych w indeksie.
Modyfikacja typu pola
Zatrzymajmy się na trzecim przypadku. Załóżmy, że modyfikujemy nieznacznie pole w indeksie z prozaicznej przyczyny – przestaje interesować nas normalizacja jego długości. Ustawiamy sobie omitNorms=”true” (zakładam, iż wcześniej było omitNorms=”false”). Indeksujemy ponownie wszystkie dokumenty, Lucene łączy nam indeksy i co się okazuje – dalej w połączonych segmentach mamy dalej znormalizowane informacje o długości pola. Coś poszło nie tak. To jest właśnie ten przypadek kiedy konieczne jest usunięcie indeksu po zmianie jego struktury, a przed pełną indeksacją. Na pierwszy rzut oka wygląda, iż jest to bardzo mała zmiana, jednak zastanawiając się dalej, mamy takie, a nie inne skutki. Warto pamiętać, iż niektóre z właściwości pól są nadpisywane przez inne, tak jak w przypadku normalizacji długości – jeżeli w jednym segmencie pole będzie posiadało normalizację, a w drugim nie, to po połączeniu segmentów otrzymamy jeden, w którym to pole będzie posiadało normalizację.