Solr 3.6: CurrencyField

Solr 3.6 przyniesie ciekawą funkcjonalność w postaci obsługi walut. Ktoś mógłby zapytać: „Po co ? Przecież wystarczy typ zmiennoprzecinkowy i mamy obsługę walut”. Przyjrzyjmy się zatem co da nam solr.CurrencyField w Solr 3.6.

Konfiguracja

Zacznijmy od konfiguracji komponentu, która jest standardowa jeżeli chodzi o Solr. Do pliku schema.xml dodajemy po prostu kolejny wpis, np. w takiej postaci:

<fieldType class="solr.CurrencyField" name="currencyField" defaultCurrency="USD" currencyConfig="currencyExchange.xml" />

W powyższej konfiguracji typu pojawiają się dwa dodatkowe atrybutu, które określają zachowanie pól typu currencyField. Po pierwsze to parametr defaultCurrency, który określa domyślną walutę dla pola. Raz zdefiniowany określa w jakiej formie dane będą zapisywane w indeksie (zmiana wartości wymaga reindeksacji danych). Drugi atrybut, currencyConfig określa plik z kursami wymiany pomiędzy walutami. Warto pamiętać, iż parametr ten ma sens tylko dla domyślnego providera wymiany (FileExchangeRateProvider) dostarczanego z Solr. Przyjrzyjmy się zatem plikowi currencyExchange.xml:

Plik definicji wymiany walut dla FileExchangeRateProvider

Poniżej przedstawiam zawartość pliku currencyExchange.xml zawierającego przykładowe przeliczniki kursów walut dla domyślnego providera wymiany dostarczanego razem z Solr.

<currencyConfig version="1.0">
 <rates>
  <rate from="USD" to="PLN" rate="3.1"/>
  <rate from="EUR" to="PLN" rate="2.5"/>
  <rate from="USD" to="EUR" rate="2.5"/>
 </rates>
</currencyConfig>

Jak widać plik ma dość prostą strukturę, podajemy walutę wejściową (from), walutę wyjściową (to) oraz przelicznik (rate). Nic prostszego 🙂

Indeksowanie danych

Aby poprawnie zaindeksować dane zawierając nasz zdefiniowany typ currencyField należy podać wartość, a następnie symbol waluty oddzielony przecinkiem. Na przykład:

<field name="price">21.99,EUR</field>

Zadawanie zapytań

Zadawanie zapytań wygląda analogicznie do indeksowania. Oprócz samej informacji o wartościach musimy także przekazać informację o walucie na jakiej Solr ma dokonywać operacji. Poniżej przykłady wykorzystujące filtrowanie po wartości oraz przedziale wartości:

fq=price:29.99,PLN
fq=price:[10.00 TO 29.99,EUR]

Jak widać, po podaniu interesujących nas wartości dodajemy przecinek, a następnie podajemy oznaczenie waluty. Co więcej, możemy skorzystać z walut zdefiniowanych wcześniej w pliku wymiany. Oznacza to, że Solr może za nas dokonać automatycznej zamiany 🙂 Pomimo możliwości automatycznej zmiany wyszukiwanej waluty wyniki zwracane są zawsze w tej zdefiniowanej jako domyślna i na razie nie ma możliwości zmiany tego zachowania.

Własny provider wymiany walut

Solr, oprócz domyślnego provider’a wymiany walut, umożliwia napisanie własnego. Aby to zrobić musimy stworzyć klasę implementującą interfejs org.apache.solr.schema.ExchangeRateProvider oraz podać naszą klasę w jako wartość atrybutu providerClass dla zdefiniowanego typu. Zakładając, iż mamy klasę pl.solr.schema.DynamicRateExchangeProvider implementującą w/w interfejs i chcemy z niej skorzystać, definicja typu mogłaby wyglądać następująco:

<fieldType class="solr.CurrencyField" name="currencyField" defaultCurrency="USD" providerClass="pl.solr.schema.DynamicRateExchangeProvider" />

Osobiście bardzo podoba mi się ta możliwość, ponieważ zyskujemy możliwość dynamicznego pobierania kursów wymiany np. poprzez webservice.

Co zostało do implementacji

W chwili pisania i publikacji tego wpisu, pola typu CurrencyField nie są obsługiwane w przypadku facetingu po zakresach.

Podsumowanie

Moim zdaniem CurrencyField jest całkiem ciekawą funkcjonalnością uwalniającą nas od przeliczania waluty po stronie aplikacji. Zamiast tego, w Solr 3.6, otrzymamy narzędzie, które umożliwi nam wyszukiwanie z automatycznym przeliczaniem waluty po stronie Solr. Dodatkowo, jeżeli pokusimy się o implementację własnego mechanizmu dostarczania przeliczników wymiany możemy otrzymać całkiem fajny w użyciu mechanizm, który sam pobierze waluty z odpowiadającego nam źródła, sam będzie je dynamiczne przeliczał, a nam zostanie tylko zadawanie zapytań 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *