Solr w wersji 3.1 i późniejszych otrzymał jakiś czas temu bardzo ciekawą funkcjonalność – sortowanie na podstawie wartości pomocą funkcji. Co nam to daje ? W zasadzie kilka ciekawych możliwości, o których poniżej.
Na początek
Pierwszy z przykładów, których przychodzi mi do głowy, być może ze względu na projekt nad którym pracowałem jakiś czas temu, to sortowanie po odległości pomiędzy dwoma punktami. Do tej pory, aby zaimplementować taką funkcjonalność konieczne była zmiany w Solr (np. wdrożenie LocalLucene i LocalSolr). Korzystając z Solr 3.1 i późniejszych, możemy sortować wyniki wyszukiwania za pomocą wartości zwracanych przez zdefiniowane funkcje. Na przykład,w Solr mamy dostępną funkcję dist wyliczającą odległość pomiędzy dwoma punktami. Jeden z wariantów funkcji to funkcja przyjmująca pięć parametrów: algorytm i dwie pary punktów. Jeżeli, przy pomocy tej funkcji, chcielibyśmy posortować wyniki wyszukiwania rosnąco od punktu o długości i szerokości geograficznej 0,0, to wysyłając parametr sort w następującej postaci otrzymalibyśmy właśnie tak posortowane wyniki:
...sort=dist(2, geo_x, geo_y, 0, 0) asc
Podejrzewam, że najczęściej wykorzystywanymi wartościami pierwszego parametru będą:
- 1 – kalkulacja odległości na podstawie metryki Manhattan
- 2 – kalkulacja odległości euklidesowej
Kilka słów o wydajności
Wszystko pięknie, tylko jak to wygląda pod kątem wydajności ? Przeprowadziłem dwa proste testy.
Podczas pierwszego testu zaindeksowałem 200 tysięcy dokumentów składających się z czterech pól: identyfikatora (pole liczbowe), opis (pole typu text) oraz x i y (dwa pola liczbowe). Żeby nie zaciemniać wyników testu do sortowania wykorzystałem jedną z prostszych funkcji dostępnych obecnie w Solr – sum – sumującą dwa argumenty. Tak zdefiniowane sortowanie porównałem z sortowaniem domyślnym, czyli po wartości score. Poniżej tabela z wynikami:
[table “11” not found /]Kolejny test polegał na porównaniu sortowania po polu typu string do sortowania z wykorzystaniem funkcji. Przebieg testu był prawie identyczny, jak przebieg pierwszego testu – indeksacja 200.000 dokumentów (z dodatkowym polem: opis_sort typu string) oraz wykorzystanie funkcji sum. Poniżej tabela z wynikami:
[table “12” not found /]Na podstawie powyższego testu widać, iż sortowanie z wykorzystaniem funkcji jest zdecydowanie wolniejsze od domyślnego sortowania (czego można było się spodziewać). Sortowanie to jest także wolniejsze od sortowania po polu typu string, jednak tutaj różnica nie jest już tak znaczna, jak w poprzednim przypadku.
Kilka słów na koniec
Oczywiście powyższy test tylko prześlizguje się po temacie wydajności sortowania z wykorzystaniem funkcji w Solr, jednak pokazuje prostą zależność. Biorąc pod uwagę to, iż nie jest to sortowanie domyśle, a dające nam naprawdę duże możliwości konfiguracyjne wydaje mi się, że jest to funkcjonalność warta zapamiętania. Na pewno będzie sprawdzać się wtedy, kiedy wymagania mówią, iż musimy sortować po wartościach zmieniających się zarówno w zależności od zapytania, jak i od stanu indeksu – tak jak w przypadku sortowania po dystansie od podanego przez użytkownika punktu.