Hledá to váš prohlížeč, ne můj server
Na tomhle webu je tři tisíce sto devadesát tři článků. Nejstarší je z dubna 2005, takže je to přes dvacet let textu na jedné hromadě. Nahoře v menu je vyhledávací pole.
Za tím polem neběží žádný vyhledávač.
Dva soubory a nic víc
Když se stránka s vyhledáváním otevře, stáhne se jeden soubor: search-index.json. Je v něm posledních pět set článků — adresa, titulek, datum, úryvek a celý text převedený na malá písmena bez diakritiky. Dneska má 402 kB, po zabalení jde po drátě 150 kB.
Zbytek archivu — dva tisíce šest set devadesát tři starších článků — leží vedle v search-index-archive.json. Ten se nestahuje při otevření stránky. Stáhne se až ve chvíli, kdy do pole opravdu něco napíšete. Má 1 MB, zabalený 344 kB.
To rozdělení je jediná optimalizace, kterou tam mám, a je tam z jednoho konkrétního důvodu: většina hledání míří do posledních pár set článků, a nikdo by neměl čekat na kompletní archiv jen proto, že si otevřel stránku a rozmyslel si to. Archiv navíc roste, kdežto těch pět set je konstanta. Za deset let se stránka bude otvírat stejně rychle jako dneska.
Než dorazí, píše se pod polem, že se ještě prohledává archiv, takže vidíte průběžné výsledky a víte, že to není konečné číslo.
Co to umí
Slova se hledají přes A: článek projde, jen když v něm jsou všechna.
Text v uvozovkách je jedna fráze. Rozdíl je vidět na mém starém telefonním blogu: palm phone jako dvě slova najde sedmdesát sedm článků, "palm phone" jako fráze čtyřicet šest.
Minus před slovem ho vylučuje. mastodon vrátí dvaadvacet článků, mastodon -twitter třináct.
A diakritika je jedno. Index je uložený složený — bez háčků a čárek, malými písmeny — a dotaz se skládá stejnou funkcí, takže snih najde jedenáct článků o sněhu, aniž byste přepínali klávesnici. Tohle je jediné místo, kde mi ta jednoduchost dala trochu zabrat: skládací tabulka je na dvou místech, jednou v Ruby při stavbě webu a jednou v JavaScriptu v prohlížeči, a kdyby se rozešly, hledání by tiše přestalo nacházet. Je proto u obou půlek napsané, že se mění jedině obě najednou.
Co z toho plyne
Když píšete do toho pole, neodchází na můj server nic. Není kam — je to statický web, žádná aplikace, žádná databáze, žádný proces, který by dotaz přijal. Prohlížeč si stáhne dva soubory a hledá v nich sám u sebe.
Abych byl ale poctivý: první dotaz, ten který odešlete z pole v menu, skončí v adrese stránky jako ?q=…. A adresy stránek mi měří analytika. Takže právě ten první dotaz vidím, byť ne jako „kdo", ale jako řádek v přehledu. Všechno další, co pak do pole napíšete nebo přepíšete, už adresu nemění a nikam neodchází.
Druhá věc: nemám co provozovat. Vyhledávání je pět a půl kilobajtu JavaScriptu a dva soubory, které se přepíšou při každé stavbě webu. Není tam žádná služba, která by mohla spadnout ve tři ráno, žádný index, který by se mohl rozejít s obsahem, a když web někam přestěhuju, přestěhuje se hledání s ním, protože jsou to prostě soubory ležící vedle článků.
Neumí to překlepy, neumí to skloňování a nezná synonyma. Chtěl bych říct, že to je záměr, ale je to spíš přijatý kompromis — je to cena za to, že tu nic neběží. Za dvacet let textu je ta cena podle mě dobrá.
