Praktický návod
Jak implementovat fulltextové vyhledávání pomocí Elasticsearch
Začni otázkami uživatelů, ne clusterem. Dokument, analyzéry i relevance musí vycházet ze skutečného hledání.
Nejdřív stručně
Vyhledávací index je odvozený model
Elasticsearch ukládá dokumenty optimalizované pro hledání. Text analyzuje na termy a při dotazu počítá relevanci; přesné filtry zpracovává bez textového skóre.
Primární databáze zůstává zdrojem pravdy. Vyhledávací index musí jít celý znovu postavit a průběžná synchronizace musí zvládnout opožděné, opakované i mazací události.
Připrav si
Co budeš potřebovat
Než vytvoříš mapping, sepiš nejdůležitější dotazy a výsledky, které mají být nahoře.
- Sadu skutečných vyhledávacích frází včetně překlepů, synonym, diakritiky a prázdných výsledků.
- Zdroj pravdy s neměnným ID dokumentu a hodnotou změny, podle které poznáš novější stav.
- Seznam textových polí, přesných filtrů, řazení a hodnot zobrazovaných ve výsledku.
- Metriky relevance a provozu: zero-result rate, kliknutí, konverze, p95 latence a chyby synchronizace.
Kroky 1 až 3
Postav samostatný read model pro hledání
Jeden dokument má obsahovat vše potřebné pro výsledek hledání. Nenahrazuj relační JOIN desítkami následných dotazů.
1. Navrhni mapping a analýzu textu
- Do dokumentu denormalizuj ID, název, popis, kategorii, značku, dostupnost a další hodnoty potřebné pro hledání a zobrazení.
- Textová pole mapuj jako text, přesné kódy, filtry a agregace jako keyword nebo číselný typ. Jeden název může mít text i keyword multi-field.
- Analyzér zvol podle jazyka obsahu. Otestuj tokenizaci, malá písmena, diakritiku, stemming a doménová synonyma na reálných frázích.
- Mapping verzuj. Nečekej, že zásadní změnu analyzéru opravíš na existujících termech bez vytvoření nového indexu a reindexace.
"name": {
"type": "text",
"analyzer": "czech",
"fields": {"raw": {"type": "keyword"}}
} Oficiální dokumentace k jazykovým analyzérům 2. Synchronizuj dokumenty idempotentně
- Pro první naplnění čti databázi po dávkách a zapisuj přes Bulk API. Velikost dávky dolaď podle objemu dokumentu a odezvy clusteru.
- Změny publikuj přes spolehlivý outbox nebo změnový feed. Consumer indexuje pod stabilním ID produktu, takže opakovaná událost nevytvoří duplikát.
- Ošetři pořadí změn verzí dokumentu nebo porovnáním updated_at. Starší zpráva nesmí přepsat novější stav.
- Smazání i skrytí produktu musí mít vlastní synchronizační cestu. Pravidelný reconciliation job porovná zdroj pravdy s indexem a opraví mezery.
POST /products-v1/_bulk Oficiální Elasticsearch Bulk API 3. Sestav dotaz z textu a filtrů
- Pro název, značku a popis použij fulltextové match nebo multi_match a každému poli dej váhu podle jeho významu.
- Dostupnost, tenant, kategorii a cenový rozsah dej do bool.filter. Filtry nemají uměle měnit textové skóre.
- Nastav maximální velikost stránky a pro hluboké procházení použij search_after místo neomezeného from.
- Výsledek vrať s ID, zobrazovanými daty a vysvětlenou stabilní strategií řazení. Primární databázi nedotazuj jednou pro každý hit.
multi_match: query=name^4, brand^2, description; filter: active=true Oficiální Elastic dokumentace k fulltextu Krok 4
Testuj relevanci jako funkci
To, že dotaz něco vrací, nestačí. Pro důležité fráze musí být správné dokumenty ve správném pořadí.
-
Vytvoř sadu očekávaných výsledků
Pro desítky skutečných frází ulož relevantní produkty a jejich přijatelné pořadí. Spouštěj ji při změně mappingu nebo vah.
php bin/phpunit --filter SearchRelevance -
Ověř obnovu indexu
Postav nový index ze zdroje pravdy, přepni alias a porovnej počet dokumentů i kontrolní dotazy bez výpadku.
POST /_aliases -
Nasimuluj opožděnou událost
Po novější aktualizaci doruč starší zprávu. Dokument musí zůstat v novějším stavu a reconciliation nesmí hlásit rozdíl.
Když to zlobí
Nejčastější chyby
Přesný filtr nic nenajde
Hodnota je nejspíš mapovaná jako analyzovaný text. Pro kódy, stav a agregace použij keyword pole a zkontroluj skutečný mapping.
GET /products/_mapping Výsledky mají špatné pořadí
Vytvoř konkrétní relevance testy a uprav váhy polí, analyzér nebo synonyma. Neřeš kvalitu jen jedním ručně vybraným dotazem.
Index obsahuje stará data
Sleduj lag synchronizace, neúspěšné bulk položky a pořadí událostí. Přidej reconciliation proti zdroji pravdy.
Změnu analyzéru nelze použít na existující pole
Vytvoř nový verzovaný index, naplň ho, otestuj a atomicky přepni alias. Mapping produkčního indexu nepřepisuj naslepo.
Hotovo
Fulltext má obnovitelný index a měřitelnou relevanci.
Elasticsearch teď slouží jako odvozený vyhledávací model: dokumenty lze znovu postavit, změny se synchronizují a pořadí výsledků hlídají testy.