Wraz niedawną publikacją Solr 7.6.0 pojawiła się możliwość ustawienia pola, bądź typu jako uninvertible. Pozwala to na kontrolę tego, co zrobi Solr z polem w przypadku kiedy konieczne będzie odwrócenie odwróconego indeksu, czyli podczas korzystania z takich funkcjonalności, jak faceting, czy sortowanie. Przyjrzyjmy się co daje nam nowa właściwość pól w Solr 7.6.0.
Przykładowa struktura danych
Zacznijmy od prostej struktury danych, która wygląda następująco:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" docValues="true" /> <field name="title" type="text_general" indexed="true" stored="true" multiValued="false"/> <field name="tags" type="string" indexed="true" stored="true" multiValued="true" />
Nic specjalnego, trzy pola w tym jeden identyfikator. Oczywiście, jeżeli zaindeksujemy przykładowe dane, mamy możliwość facetingu na każdym z wymienionych pól. W naszym przypadku zapytania takie jak poniższe powinny wykonywać się bez problemów, np:
http://localhost:8983/solr/test/select?q=*:*&facet=true&facet.field=title
Dodajemy właściwość uninvertible
Jeżeli zmodyfikujemy nasz przykład i dodamy właściwość uninvertible ustawioną na wartość true, która jest domyślną wartością tej właściwości, nic nie powinno się zmienić i nasze przykładowe zapytanie będzie dalej działać:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" docValues="true" /> <field name="title" type="text_general" indexed="true" stored="true" multiValued="false" uninvertible="true"/> <field name="tags" type="string" indexed="true" stored="true" multiValued="true" />
Zachowanie pól z uninvertible=false
Zmodyfikujmy nasz przykład tak, aby pole title miało właściwość uninvertible ustawioną na wartość false:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" docValues="true" /> <field name="title" type="string" indexed="true" stored="true" multiValued="false" uninvertible="false"/> <field name="tags" type="string" indexed="true" stored="true" multiValued="true" />
Jeżeli ponownie zadalibyśmy nasze zapytanie do Solr, zachowanie zmienia się. Zamiast wyników facetingu dostalibyśmy pustą tablicę. Dalczego? Ponieważ w przypadku ustawienia pola jako uninvertible=false Solr nie pozwoli na zbudowanie field cache, który to wykorzystywany jest w przypadku braku doc values. Oczywiście wiemy, że skorzystanie ze struktury doc values nie jest możliwe w przypadku pól analizowanych.
Wykorzystanie
Właściwość uninverible możemy wykorzystać wtedy, kiedy chcemy zabezpieczyć naszą instancję lub klaster przed intensywnym wykorzystaniem pamięci w związku z field cache. Przykładem może być właśnie wyłączenie funkcjonalności takich jak faceting, czy sortowanie na polach, które podlegają analizie, a tym samym mają potencjalnie dużo unikalnych wartości, co może powodować znaczne wykorzystanie pamięci.