Nový fulltext obchodů Internet Mall —
Jak si někteří z vás už možná všimli, obchody Internet Mall právě prochází přestavbou (píše o tom třeba Jirka Chomát). Navenek se mění vzhled a budeme přidávat další funkčnost, ale nejzásadnější změny se dějí „ve vnitřnostech“ obchodů a technologiích na pozadí. Součástí těchto změn je i výměna fulltextového vyhledávače na obchodech.
Jak to bylo
Původní fulltextový vyhledávač byl na svou dobu poměrně pokročilý a zvládal nalézt to, co konkurence neumí najít dodnes. Nicméně měl i řadu nedokonalostí a návštěvníkům obchodu, zhýčkaným Googlem, Jyxem a Seznamem, nedokázal smysluplně odpovědět na některé od pohledu celkem triviální dotazy. V poslední době si uživatelé navykli používat fulltext často bez toho, aniž by se sebeméně pokusili zboží nebo kategorii najít v katalogu. Dnes už mě neudivuje, že na obchodě Bílé zboží je jedním z nejhledanějších výrazů slovo pračky. Laskavému čtenáři nechávám za domácí úkol zkusit si toto slovo vyhledat na našich předních internetových obchodech.
Požadavky
Požadavky na nový fulltext by se daly shrnout do jednoduchého pravidla: Prostě najít. Analýzou statistik vyhledávaných výrazů jsme došli k závěru, že potřebujeme „něco jako Google, ale uzpůsobený pro specifické potřeby obchodu.“
Nakonec jsme formulovali následující funkcionalitu, kterou bychom potřebovali:
- Prohledávání nejen samotných výrobků, ale i jednotlivých kategorií, značek a textových stránek.
- Podpora češtiny – alespoň schopnost hledání jednotného a množného čísla (pračka vs. pračky), práce s diakritikou i bez ní
- Schopnost vyhledávat v kódových označeních výrobků (typicky výrobci televizí jsou v tomto ohledu naprosto šílení – kdo mohl vymyslet název TH-37PA30EJ? Návštevníci potom ze zcela pochopitelných důvodů hledají výrazy typu „TH37PA“, nebo „37-PA-30“, no a potom podle toho něco hledejte.)
- Pokud možno i oprava překlepů. Velmi často návštěvníci hledají například Whirpool.
- Prohledávání doplňkových údajů u zboží, jako jsou parametry, komentáře atd.
- „Last, but not least“, musí to být rychlé.
Jestli se nám podařilo splnit ono základní pravidlo Prostě najít budou muset posoudit až naši zákazníci, ale já bych se s vám rád ve stručnosti podělil o to, jak jsme na to šli.
Základní princip
Nejprve jsme se museli oprostit od pojmu „výrobek“ a jako základní jednotku jsme vzali dokument, který je tvořen textovými informacemi o různé míře důležitosti. Značka a název výrobku je důležitější než jeho popisek, který je důležitější než komentáře k výrobku. Každý dokument má své URL a další atributy.
Celý dokument se rozdělí na jednotlivá slova a každému slovu v rámci dokumentu se přidělí relevance. Relevance je tím vyšší, čím důležitější je část dokumentu, kde se slovo nachází a také čím častěji se v dokumentu opakuje.
Hacky, carky a tak dále
Abychom byli schopni pracovat s češtinou i bez ní, museli jsme použít techniku, kdy slova převedeme na jejich základní tvar (tzv. stemming). Naštěstí nám v tomto pomohl open-source nástroj ispell, který kromě kontroly pravopisu umí při troše dobré vůle právě i stemming. Hodně nám také pomohl článek Pavla Stěhule o fulltextovém vyhledávání pomocí databáze PostgreSQL, kterou používáme.
Kódy a šifry
Vyhledávání v kódových názvech jsme vyřešili tak, že indexovaný obsah, stejně jako hledané výrazy nedělíme pouze na celá slova oddělená mezerou, ale také je dělíme na rozhraní písmena a číslice (nebo jiného znaku). Takže ta hrůza TH-37PA30EJ se rozpadne na „TH 37 PA 30 EJ“. A s tím už se dá trochu pracovat.
Překlepi
K opravě překlepů jsme chtěli také zneužít výše zmiňovaný ispell, který je k tomu uzpůsoben, jenže jsme narazili na zásadní problém. Ispell opravuje překlepy v češtině a největší procento překlepů udělají naši návštěvníci v názvu značky nebo v obchodním jméně (jako již uváděný „Whirpool“). Museli jsme tedy jít cestou vlastní. Pro nalezení nejbližšího výrazu používáme Levenshteinovu vzdálenost, takže když návštěvník hledá nějaký výraz, který ve slovníku nemáme, pokusíme se najít nejrelevantnější slovo s nejmenší vzdáleností od původně hledaného výrazu. Kupodivu to funguje.
Rychlost
Co se týče rychlosti je systém trochu omezen tím, že pro svou práci používá běžnou SQL databázi a žádný speciální datový stroj, který se používá na „velkých“ vyhledávačích. Ale i přesto se nám daří v současnosti vyřídit požadavek na hledání v průměrném čase 65ms na vcelku komoditním hardware. Pokud ovšem používanost fulltextu nějak zásadně vzroste (v což doufáme :-) ), budeme muset celý systém přesunout na zvláští server. Naštěstí je na to celý systém připraven a je na samotném enginu obchodů nezávislý.
Doufám, že jsem vás tímto technickým popisem neunudil k smrti a že jste v něm nalezli třeba trochu inspirace pro vaši vlastní potřebu.