W Solr 1.4 pojawił się nowy typ zapytań funkcyjnych zwanych frange. Służą one do wyszukiwania informacji z danego przedziału. Według twórców Solr zapytania te powinny być znacznie szybsze (w niektórych przypadkach testy wykazały nawet 40-krotny wzrost wydajności) od zwykłych zapytań. Stwierdziłem, że przeprowadzę prosty test sprawdzający, czy można spodziewać się takich wzrostów wydajności w przypadku zapytań o przedziały.
Zadawanie zapytań
Aby skorzystać z zapytań frange należy zmodyfikować składnię zapytania. Do tej pory, zapytanie o zakres danych mogło wyglądać w następujący sposób:
fq=test_si:[0+TO+10000]
w tym momencie, należy zadać to zapytanie w poniższy sposób:
fq={!frange l=0 u=10000}test_si
Oczywiście, możliwe jest również składanie zapytań o zakresy inne, niż liczbowe, na przykład:
fq={!frange l=adam u=mariusz}imie
Wydajność
Sama logika testu jest dość prosta. Struktura indeksu zawiera dwa pola: id, czyli unikalny identyfikator oraz pole namestr (typu String) w którym generuje wartości o które będę się pytał. Zaindeksowałem w ten sposób 100.000 dokumentów. Dodatkowo w każdym z dokumentów termy w polach są unikalne, tak, aby w łatwy sposób móc określić procent termów pokrytych przez dane zapytanie. Następnie zacząłem zadawać zapytania pokrywające pewien procent termów w indeksie. Każde zapytanie zadawałem kilkukrotnie uśredniając wyniki. Poniższa tabela ilustruje wynik testu:
[table “5” not found /]Jak widać standardowe zapytanie o przedział danych jest szybsze tylko w przypadku zapytania, które pokrywa małą ilość termów w polu. Już od 5% termów nowy typ zapytań o przedział jest dużo szybszy, co widać w przypadku większego pokrycia, np. 50%. Co ciekawe uzyskujemy wzrost wydajności kilkukrotny, co napawa optymizmem na jeszcze szybsze wyszukiwanie.
Na koniec
Wyniki mojego testu różnią się pod względem wydajności z tym co napisał Yonik Seeley na swoim blogu (wiąże się to m.in. z tym, że dane były przygotowane szybko), jednak co by nie mówić, testy pokazują wzrost wydajności w przypadku zapytań wykorzystujących frange.