Ilość dostępnych query parserów w Solr zawsze mnie zadziwiała. Czy jest tu ktoś kto jest w stanie wymienić je wszystkie? Jednak w dzisiejszym wpisie nie będziemy się przyglądać wszystkim parserom, ale jednemu konkretnemu o nazwie SwitchQueryParser wprowadzonemu w Solr 4.2.
Idea działania
Idea działania jest dość prosta – umożliwić przetwarzanie prostego warunku po stronie Solr i przekazanie do jako podzapytanie. Na przykład, wyobraźmy sobie, że mamy aplikację, która rozumie cztery wartości pola priceRange:
- cheap – w przypadku kiedy cena produktu, zapisana w polu price, jest niższa, niż 10$,
- average – w przypadku kiedy cena produktu jest pomiędzy 10, a 30$,
- expensive – w przypadku kiedy cena produktu jest wyższa niż 30$,
- all – w przypadku kiedy chcemy pokazać wszystkie produkty, bez względu na cenę
Chcielibyśmy tę logikę zaszyć w Solr, aby nie było konieczności zmian po stronie aplikacji za każdym razem kiedy chcemy zmienić powyższe warunki. W tym właśnie celu wykorzystamy SwitchQueryParser.
Nasze zapytanie
Załóżmy, że nasza aplikacja jest w stanie zadać następujące zapytanie:
http://localhost:8983/solr/collection1/price?q=*:*&priceRange=cheap
A zatem chcielibyśmy, aby na powyższe zapytanie Solr zwrócił wszystkie dokumenty (q=*:*), ale zawężone do tych posiadających cenę niższą niż 10$ (parameter priceRange=cheap).
Konfiguracja Solr
Oczywiście nie chcemy konfiguracji naszych zakresów pola price wysyłać w zapytaniu, bo nie miałoby to większego sensu. My zdecydowaliśmy się stworzyć nowy SearchHandler o nazwie /price z następującą konfiguracją (dodajemy go do pliku solrconfig.xml):
<requestHandler name="/price"> <lst name="defaults"> <str name="priceRange">all</str> </lst> <lst name="appends"> <str name="fq">{!switch case.all='price:[* TO *]' case.cheap='price:[0 TO 10]' case.average='price:[10 TO 30]' case.expensive='price:[30 TO *]' v=$priceRange}</str> </lst> </requestHandler>
Jak widać konfiguracja naszego SearchHandlera składa się z dwóch elementów. Po pierwsze w sekcji defaults zdefiniowaliśmy, iż parametr priceRange będzie domyślnie przyjmować wartość all. Dodatkowo zdefiniowaliśmy filtr (fq) działający w oparciu o SwitchQueryParser (!switch). Dla każdej z możliwych wartości parametru priceRange (v=$priceRange) zdefiniowaliśmy odpowiedni filtr wykorzystując wyrażenie case.wartośćPolaPriceRange=filtr. Zatem, kiedy wartość parametru priceRange w zapytaniu będzie wynosić cheap to filtr zdefiniowany przez case.cheap będzie wykorzystany, jeżeli ta wartość będzie wynosić expensive to filtr zdefiniowany przez case.expensive będzie wykorzystany, itd.
O czym należy pamiętać
Jest jedna, ważna rzecz o której należy pamiętać w przypadku korzystania z opisywanego parsera. W naszym przypadku podanie do parametru priceRange wartości innej, niż 4 powyżej wymienione będzie skutkowało błędem Solr.
Kilka słów podsumowania
Moim skromnym zdaniem SwitchQueryParser pomimo tego, że nie będzie stosowany przez większość użytkowników Solr wydaje się być fajnym pomysłem. Biorąc pod uwagę to, że pozwala ukryć przed aplikacją bardzo prostą logikę oraz to, że jest dość prosty, a co za tym nie wymagający jeżeli chodzi o zasoby, na pewno znajdą się użytkownicy, którym ten parser ułatwi pracę 🙂