Opis projektu Mojim cieľom je vytvoriť komplexné riešenie pre prezeranie všetkých produktov, ktoré ponúka portál luxurymoda.sk. Zadanie som si vybral kvôli faktu že som sa s Apache SOLR stretol veľmi zbežne už v minulosti, a bol som zvedavý či je túto platformu možné použiť ako plnohodnotný nástroj pre vyhľadávanie v dokumentoch, teda napríklad či je možné pomocou tejto platformy vytvoriť vyhľadávací a indexovací podklad pre plnohodnotný intenetový obchod. Hlavná motivácia bola vyskúšať si viaceré základné aj pokročilé vlastnosti platformy SOLR 4.0, ktoré definitívne nie sú "štandardnou" súčasťou bežných internetových obchodov, avšak potencionálnemu používateľovi by priniesli mnoho úžitku. Existujúce riešenie Existujúce riešenie pre vyhľadávanie a nákup produktov firmy LUXURY MÓDA je k dispozícii na webovom portáli http://luxurymoda.sk. Z technického hľadiska sa jedná o webshop napísaný v home-made (proprietary) PHP systéme, pričom administrácia je strohá, a vyhľadávanie produktov taktiež. Jeden produkt môže byť zaradený v jednej alebo viacerých kategóriách, pričom veľmi speciálnou aplikačnou logikou sa následne v PHP skripte rozlišuje, či je dané priradenie značka výrobcu alebo typ produktu. V databázi teda existujú iba "kategórie", a či je kategória výrobca sa určuje až priamo za behu skriptu. Čo sa hlavnej problematiky môjho zadania, vyhľadávania týka, originálne riešenie podporuje jednoduché prehľadávanie produktov výberom jednej až maximálne dvoch súčasných kategórií, a ďalej podporuje filtre nad produktami, ktoré do daných vybraných kategórií spadajú. Tieto filtre zahŕňaú 1. vyhľadávacie políčko hore na stránke 2. filter pohlavia 3. filter veľkosti tovaru 4. filter dostupnosti tovaru 5. filter rozmedzia ceny tovaru Samotné vyhľadávanie pomocou filtrov funguje dobre, avšak existujú viaceré oblasti, ktoré je možné zlepšiť: nemožnosť filtrácie na základe viac ako dvoch kategórií produktu žiadne zvýrazňovanie vo výsledkoch vyhľadávania žiadne návrhy pre vyhľadávanie žiadne opravy chýb v hľadanom výraze, lexer, stemmer ani nič podobné vo fazetách nie sú zobrazované počty produktov v daných kategóriách Práve všetky tieto vlastnosti riešenie postavené na platforme SOLR plánuje dodať. Z toho vyplýva zadanie, ktoré je uvedené nižšie. Zadanie Mojim zadaním je vytvoriť fazetový a fulltextový prehľadávač informácií v databáze produktov módnej stránky s oblečením http://luxurymoda.sk. Dizajn a ovládanie vyhľadávača by malo byť čo najviac podobné originálnemu portálu, avšak postavené na úplne inom technickom riešení. Opis projektu 1
Opis riešenia V tejto kapitole podrobne opíšeme vytvorené riešenie postavené na platforme Apache SOLR 4.0. Databáza produktov Databáza produktov portálu Luxury Móda obsahuje najrôznejšie druhy oblečenia, topánok, parfémov a iných módnych doplnkov. V databáze sa nachádzajú k väčšine produktov doplnkové informácie informácie ako napríklad značka výrobcu (zistiteľná po znalosti biznis logiky existujúceho riešenia), kategórie zaradenia, cena, zľavová cena a podobne. Z portálu boli tak isto stiahnuté všetky obrázky produktov, teda prehľadávanie bude pre používateľa navigované aj vizuálne. Pôvodná databáza portálu je typu MySQL 5.1, pričom použítý systém na portáli je naprogramovaný na zakázku pre zákazníka na mieru, teda nejedná sa o žiadny štandardný e-shop systém. Pre účely tohto predmetu bol skonštruovaný PHP skript, ktorý pôvodnú databázu produktov prešiel a uložil v tvare XML dokumentu. Pracovať budeme teda s XML databázou všetkých produktov na portáli Luxury Móda SK. Konkrétne sa o jednom produkte v databázi evidujú nasledovné údaje (skutočné XML produktu): <doc> <field name="id">1-pepe-jeans-kratke-tricko</field> <field name="sku">p16x16</field> <field name="name">1.pepe Jeans kratke tricko</field> <field name="description">pepe Jeans tricko</field> <field name="keywords">pepe Jeans tricko</field> <field name="price">39</field> <field name="features">dodacia doba 72 hodín</field> <field name="features">materiál 100% bavlna</field> <field name="sale">true</field> <field name="sale_price">19</field> <field name="buy_times">11870</field> <field name="popularity">4.89</field> <field name="sizes">l</field> <field name="sizes">xl</field> <field name="gender">male</field> <field name="in_stock">true</field> <field name="clearance">true</field> <field name="manu">pepe Jeans</field> <field name="cat">oblečenie</field> <field name="cat">tričká</cat> <field name="photos">f47.jpg</field> <field name="photos">f48.jpg</field> </doc> Polia features, sizes, cat a photos sú viacnásobné. Ku každému produktu je v políčku manu vyplnený unikátny názov výrobcu. Databáza obsahuje aj záznamy o výrobcoch, ktoré vyzerajú nasledovne: Opis riešenia 2
<doc> <field name="id">manu289</field> <field name="name">pepe Jeans</field> <field name="address_s">stu FIIT room 265-289</field> </doc> V oboch prípadoch je pole id unikátne. Pri produkte existuje aj mnoho nepovinných polí, takže nie všetky produkty musia mať všetky polia definované. Napríklad pokiaľ produkt nie je v zľave, nemá pole sale_price. Detaily implementácie a implementované súčasti Vyhľadávanie je implementované pomocou Apache Solr, najnovšia verzia 4.0. Implementované bolo kompletné rozhranie pôvodného portálu LUXURY MODA.SK, ktoré bolo vhodne doplnené o rozšírené možnosti platformy SOLR. Používateľské rozhranie je založené na príklade "collection1" zo základného balíka Solr, avšak výrazne modifikované. Nie je zmenený iba komplet celý vzhľad a funkčnosť, ale aj základné nastavenia a cesty Solr, nastavenia, cesty a pravidlá Jetty ako aj komplet celá Jetty web aplikácia, ktorá nahrádza celé solr admin rozhranie a pribaľuje súbory potrebné na prevádzku nového používateľského rozhrania (štýlý, obtázky elementov, templates, obrázky produktov, html súbory, javascripts a podobne). Admin rozhranie je tak isto v nastaveniach plne zakázané. Všetky na mieru funkcie vo vzhľade stránky, ako aj celý HTML výstup pre každú jednu požiadavku bol implementovaný v jazyku Velocity. Špecifické novinky rozhrania oproti demo rozhraniu "collection1" a všeobecné funkcie sú uvedené nižšie. Spell check (mysleli ste...?) Pokiaľ odpoveď solr vráti dodatočné návrhy a korekcie pre vyhľadávaný dotaz, tieto sú vždy korektne vypísané nad výsledkami vyhľadávania. Korekcie môžu byť vypísané aj keď vyhľadávanie vráti výsledky, čo je štandardná súčasť platformy solr. Samotné návrhy a informácie funkcie spell check boli však vo verzii 4.0 výrazne rozšírené, čo spôsobilo, že ukážkový demo príklad velocity rozhrania, Solritas, ich vypisoval nesprávne, presnejšie nasledovne: Did you mean {collationquery=samsung,hits=2,misspellingsandcorrections={ssmung=samsung}}? Po kliknutí na odkaz sa výraz stále duplikoval a did you mean korekcia nikdy nezmizla, čo potom vyzeralo nasledovne: Did you mean {collationquery={collationquery={collationquery=samsung,hits=2,misspellingsandcorrections={samsung=samsung Navyše v prípade, že sa nenašiel žiadny dokument (napríklad vyhľadávanie "ssmung spixxx"), výpis zlyhal úplne a odkaz smeroval na /browse?q=$esc.url($response.response.spellcheck.suggestions.collation), čo značí zlyhanie spracovania na strane velocity (velocity vypíše vyraz, ktorý nedokáže spracovať). Celé toto spracovanie bolo prepísané (približne 80 riadkov velocity kódu) a výsledky sú nasledovné: Opis riešenia 3
V tomto prípade sa dopyt podobá na viacero produktov a opravený dopyt vracia 69 výsledkov. Po kliknutí na odkaz obsahuje vyhľadávanie iba opravenú informáciu. Druhá verzia, v prípade že sa výraz nepodobá na žiadne produkty a nevracia žiadne výsledky, vyzerá nasledovne: V tomto prípade vráti SOLR iba návrhy samotných slov, ktoré dokázal upraviť. Nevráti teda počty výsledkov, pretože sa nejedná o návrhy vyhľadávacích fráz, ale čisto iba o návrhy slov. Je to spôsobené tým, že slovo "rgrgw" solr opraviť nedokázal. Výpis pre používateľa uvedený na snímku reprezentuje všerky možné Opis riešenia 4
permutácie všetkých možných opráv slov, ktoré solr vrátil a je implementovaný priamo vo velocity template index.vm, ktorý používa každý jeden súbor vo velocity štruktúre. Vlastné stránkovanie Štandardné stránkovanie bolo prerobené tak, aby rešpektovalo logiku pôvodného stránkovania na luxurymoda.sk. Je implementované ako makro my_pagination vo velocity na približne 40 riadkov kódu. Porovnanie: Štandardné stránkovanie: 32 results found. Page 1 of 4 next; Nové Detail produktu Bol implementovaný detail produktu, ktorý sa aktivuje ak vyhľadávanie vráti iba jeden výsledok. Detail obsahuje omnoho viac informácií o produkte ako vo výpise medzi ostatnými produktami, obsahuje jeho kompletné vlastnosti (features), výpis všetkých jeho možnych velkostí a zobrazenie všetkých fotiek produktu, ako aj rozšírený popis. Návrhy vyhľadávania Návrhy vyhľadávania sú novinkou v solr 4.0, sú dostupné na adrese /suggest. Opis riešenia 5
Zvýrazňovanie Zvýrazňovanie bolo implementované vo výsledkoch vyhľadávania ako aj v detaile produktu. Aby sa vyhľadávaný výraz preniesol aj do detailu produktu je použitý trik, ktorý po kliknutí na produkt vo výpise výsledkov na zažiatok výrazu pridá reťazec "id:$doc.getfieldvalue('id') ", pričom ale pôvodný vyhľadávaný výraz nechá za vloženým identifikátorom. Keďže ID produktov je unikátne, je zaručené že vyhľadávanie vráti už iba jeden výsledok. Zároveň pôvodný hľadaný výraz zvýrazní hľadané slová aj v detaile produktu. Zvýrazňovanie v detaile: Zvýrazňovanie vo výpise výsledkov: Opis riešenia 6
ASCIIFoldingFilter Bol aplikovaný ASCIIFoldingFilter v čase indexovania ako aj vyhľadávania. Toto dovoľuje vyhľadať napríklad produkty, ktoré v názve obsahujú "tričko" pomocou výrazu "tricko" alebo aj "ťríčkô". Podobné produkty (more like this) Funkcionalita more like this bola implementovaná s nasledovnými váhami: <str name="mlt.qf"> text^0.5 id^10.0 sku^10.0 name^5.5 description^3.0 manu^1.1 cat^1.3 Opis riešenia 7
features^3.0 keywords^5.0 gender^0.7 sizes^0.5 </str> ID^10.0 bolo zvolené z dôvodu, že url názvy produktov sa budú vždy čo najviac podobať. URL názov je názov produktu s odstrádenými "non-url friendly" znakmi, teda napríklad rydel-house-kratketricko. Fazetové prehľadávanie Bolo implementované štandardné fazetové prehľadávanie, založené na príklade "collection1". Je možné prehľadávať pomocou značky produktu alebo jeho kategórie. Ďalej je možné produkty filtrovať podobne ako na pôvodnej stránke pomocou filtra na pohlavie, veľkosť, dostupnosť a ľubovoľnú cenu. Vo všetkých prípadoch sa jedná o fazety, ktoré sú do požiadavky pridávané ako parametre "&fq=...". V hornom menu sa vypisujú iba neprázdne fazety. Fazeta výobcov: Opis riešenia 8
Fazeta druhu tovaru: Opis riešenia 9
Filtrované produkty a výpis filtra produktov (obsluha vo velocity): Vstup programu Solr poskytuje viaceré štandardné selektory poskytujúce výstup v podobe nájdených výsledkov vo formáte XML alebo JSON. Takáto adresa je napríklad /select, ktorej sa predá vyhľadávací výraz "q", prípadne daľšie informácie o fazetovom prehľadávaní, rozsahoch, boost fields a podobne. Vstupná XML databáza sa v Solr indexuje POSTovaním na adresu /update, toto obsluhujú shell skripty v adresári docs. Výstup programu Výstopom algoritmu prehľadávania sú produkty alebo výrobcovia vyhovujúce hľadanému výrazu zoradené podľa relevantnosti, pokiaľ nie je špecifikované inak. Vstup programu 10
Reálny prínos projektu Je zrejmé, že riešenie založené na platforme SOLR ponúka omnoho širšie, bohatšie, pohodlnejšie a presnejšie možnosti vyhľadávania ako vyhľadávanie v pôvodnom proprietary PHP systéme. Už len vlastnosti ako počet položiek v rôznych kategóriách, návrhy a korekcie vyhľadávaní, podobné produkty alebo ASCIIFoldingFilter prinesú prípadnému používateľovi omnoho väčší komfort a prehľad pri prezeraní informácií. Rozdiel je teda badateľný (PHP riešenie používa na vyhľadávanie v produktoch obyčajnú MySQL LIKE klauzulu, SOLR ide omnoho ďalej). Produkt založený na SOLR nebude nikdy nasadený do reálnej prevádzky, jednalo sa skôr o test, technologické demo a overenie prototypu ako o reálny produkt. Ako riešenie spustiť Stačí rozbaliť uvedený ZIP archív a v adresári /solr-4.0.0/01-vypracovanie spustiť "java -jar start.jar". Databáza je nahratá, jediné čo zabalené riešenie neobsahuje sú obrázky produktov, kvôli veľkosti archívu. XML databáza je v adresári 01-vypracovanie/docs, obslužné skripty delete_all.sh a upload.sh môžu byť použité na aktualizáciu databáze. Riešenie následne beží na http://localhost:8983. Reálny prínos projektu 11