A teraz dwie sroki za ogon – nowy artykuł i rozdanie w naszym małym konkursie, gdzie można było wygrać elektroniczną wersję książki Apache Solr 4 Cookbook. W artykule chcielibyśmy pokazać, jak zaimplementować losową kolejność dokumentów w wynikach zapytania zwracanego przez Apache Solr. Nasz przykład jest rozwiązaniem rzeczywistego problemu – właśnie dzięki niemu wylosujemy dwóch zwycięzców naszego konkursu. Autorzy komentarzy, którzy znajdą się na początku wyników wyszukiwania otrzymają naszą nagrodę.
Dokumenty
Nasze dokumenty zawierają informację o uczestnikach konkursu – ich id, imię/nick (jako pole author) oraz pole email. Dla przykładu jeden rekord może wyglądać w następujący sposób:
<doc> <field name="id">1</id> <field name="author">Solr.pl author</field> <field name="email">blog(at)solr.pl</field> </doc>
Nasze bardzo „big data” zawiera 19 rekordów, może powinniśmy użyć map/reduce? :).
Schema
Plik schema.xml opisujący strukturę indeksu jest również bardzo prosty. W naszym przypadku zawiera następujące pola:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="author" type="text_general" indexed="true" stored="true"/> <field name="email" type="text_general" indexed="true" stored="true"/>
Dodatkowa konfiguracja
Powinniśmy upewnić się się, że plik schema.xml zawiera następujące definicje typu i pola:
<fieldType name="random" class="solr.RandomSortField" indexed="true" /> <dynamicField name="random_*" type="random" />
W przykładowym pliku schema.xml dostarczanym przez Solr ten typ i definicja pola są dostępne domyślnie. Będziemy potrzebować tych definicji do generowania losowej kolejności wyników.
Wykonywanie zapytań z losowym porządkiem sortowania
Tworzenie zapytań z losowym porządkiem wyników jest trochę nietypowe. Budujemy zapytanie jak zwykle z wyjątkiem definicji sortowania wyników. Parametr sort używa zdefiniowanego wcześniej dynamicznego pola z prefiksem random. Na przykład:
localhost:8983/solr/competition/select?q=*:*&sort=random_12939291%20desc
Jak to działa?
Solr wylicza kolejność dokumentów bazując na nazwie pola dynamicznego oraz na numerze wersji indeksu. Oznacza to, że za każdym razem, gdy używamy tego samego pola na tym samym indeksie (jeżeli indeks nie zmienił się pomiędzy zapytaniami), otrzymamy te same rezultaty. To wada tej metody, chociaż może okazać się przydatna w pewnych okolicznościach. Na przykład stronicowanie – nie chcemy dostać zdublowanych wyników na różnych stronach, prawda? Z powodu powyższego za każdym razem powinniśmy generować nową nazwę pola przesyłając do Solr zapytanie z naszej aplikacji.
A taraz – wyniki konkursu!
W losowaniu użyliśmy podanego poniżej zapytania. Liczba użyta w nazwie pola dynamicznego jest absolutnie losowa i została wygenerowana poprzez zadanie następującego pytania: „Tato, możesz mi podać kilka dowolnych liczb?” :). Tak więc nasze zapytanie uzyskało formę:
localhost:8983/solr/collection1/select?q=*:*&indent=true&rows=2&sort=random_3721117253841%20desc
Co dało następujące wyniki:
<result name="response" numFound="19" start="0"> <doc> <str name="id">9</str> <str name="author">Rajeev Srivastava</str> <str name="email">[CENSORED]</str> <long name="_version_">1431017731370516481</long></doc> <doc> <str name="id">8</str> <str name="author">Evgeny</str> <str name="email">[CENSORED]</str> <long name="_version_">1431017731370516480</long></doc> </result>
Zwycięzcy
- Rajeev
- Evgeny
Gratulujemy! Skontaktujemy się z Wami w najbliższym czasie z dalszymi informacjami, w jaki sposób możecie otrzymać nagrodę. Jeszcze raz: gratulacje! Do wszystkich uczestników: Dziękujemy za udział i za Wasze komentarze.