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í.

30 minut · Elasticsearch

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

  1. Do dokumentu denormalizuj ID, název, popis, kategorii, značku, dostupnost a další hodnoty potřebné pro hledání a zobrazení.
  2. 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.
  3. Analyzér zvol podle jazyka obsahu. Otestuj tokenizaci, malá písmena, diakritiku, stemming a doménová synonyma na reálných frázích.
  4. 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ě

  1. 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.
  2. 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.
  3. Ošetři pořadí změn verzí dokumentu nebo porovnáním updated_at. Starší zpráva nesmí přepsat novější stav.
  4. 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ů

  1. 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.
  2. Dostupnost, tenant, kategorii a cenový rozsah dej do bool.filter. Filtry nemají uměle měnit textové skóre.
  3. Nastav maximální velikost stránky a pro hluboké procházení použij search_after místo neomezeného from.
  4. 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í.

  1. 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
  2. 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
  3. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.