Webspire

Administrační systém

Creative day: vyhledávání

V rámci našich creative days máme jednou za čas možnost si „hrát“ s novými technologiemi a zkoumat nám zatím neprobádané oblasti. V rámci tohoto dne jsme se tentokrát zaměřili na vyhledávání v záznamech modulů našeho redakčního systému.

Elasticsearch logo
Elasticsearch logo

Do rukou jsme si vzali Elasticsearch - mocný to nástroj (nejen) na vyhledávání napříč vším možným i nemožným.

Hlavní motivací bylo pousnout vyhledávání v radakčním systému o krok dále. V RS máme momentálně nasazeno vyhledávání pouze v názvech jednotlivých modulů - tzn. uživatel je schopný rychle přejít např. z výpisu článků do výpisu katalogu produktů. Avšak velice často by se hodila možnost přecházet mezi konrétními záznamy - např. přejít přímo na editaci produktu dle jeho jména či kódu. A právě na vyhledávání záznamů v modulech jsme se rozhodli zkusit použít Elasticsearch.

Cíl byl jasný - vyhledávat v datech modulů (tabulek) tak, aby člověk snadno nalezl hledaný záznam napříč všemi moduly a jejich záznamy.

V PHP jsme si tedy napsali jednoduchý skript, který prošel všechny záznamy modulů a za pomocí Elasticsearch-PHP knihovny „nahrnul“ data do indexů - pro každý záznam jeho ID, title (název či nadpis), perex (typicky textový popis), jazyk záznamu a název rodičovského modulu.

Když už jsme měli k dispozici zaindexovaná data, již stačilo jen dopsat jednoduchou obslužnou logiku, která prohledá daný index v aktuální jazykové mutaci a vyhledá záznamy odpovídající hledané frázi. V konečné fázi by se tyto výsledky vyhledávání zobrazovaly pod vyhledávacím polem jako odkazy vedoucí na editaci/náhled záznamu.

Při experimentování jsme narazili na několik poznatků a samozřejmě také nemálo problémů:

  • Potvrdilo se nám, co jsme čekali - ES je opravud rychlý, a to jak ve vyhledávání, tak i v indexování. Prvotní implementace očekávala spouštění reindexace všech záznamů najednou přes CRON job jednou za několik desítek minut (a tedy s omezením, že prohledávaná data nemusí být vždy stoprocentně aktuální).
    V praxi by však šlo napojit reindexaci konkrétního záznamu na událost uložení záznamu v RS, čímž by prohledávaná data byla vždy aktuální.
  • Data mají různou strukturu a ne všechny moduly obsahují klíčová data (podle kterých by šlo záznamy najít) v názvu nebo popisu - např. objednávku mohu hledat podle variabilního symbolu nebo čísla objednávky.
  • Není string jako string - například stringové sloupce pro uložení čísla objednávky nelze analyzovat jako textový řetězec v češtině.
  • Problém nastavení indexů resp. analyzátorů v ES vzhledem k jazykové mutaci záznamů (každá jazyková mutace vyžaduje specifický způsob jakým analyzovat indexovaná data).

Abychom mohli navrhované řešení nasadit do produkce, je potřeba vyřešit především lepší granularitu indexování/analýzy vstupnách dat (sémantika dat může být modul od modulu jiná) a také způsob vyhledávání (protože ES nabízí opravdu velké množství způsobů jak data vyhledávat).

Creative day potvrdil, že Elasticsearch je pro nás perspektivní technologie a jsme schopní v případě potřeby toto řešení nasadit do produkce.

Sdílet:
###message