Index – usuwać, czy nadpisywać ?

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ę.

This entry was posted on środa, Luty 16th, 2011 at 09:14 and is filed under Solr. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.