Sortowanie po wartościach funkcji w Solr (SOLR-1297)

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:

ZapytanieIlość wynikówCzas odpowiedziCzas ponownego wywołania zapytania
q=*:*&sort=score+desc200.00031ms0ms
q=*:*&sort=sum(geo_x,geo_y)+desc200.000813ms0ms
q=opis:ala&sort=score+desc200.00047ms1ms
q=opis:ala&sort=sum(geo_x,geo_y)+desc200.000797ms1ms

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:

ZapytanieIlość wynikówCzas odpowiedziCzas ponownego wykonania zapytania
q=*:*&sort=opis_sort+desc200.000267ms0ms
q=*:*&sort=sum(geo_x,geo_y)+desc200.000823ms0ms
q=opis:ala&sort=opis_sort+desc200.000266ms1ms
q=opis:ala&sort=sum(geo_x,geo_y)+desc200.000810ms1ms

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.

This entry was posted on poniedziałek, Luty 28th, 2011 at 08:58 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.