12 - Práce s relačními daty

 

Elasticsearch neumožňuje pracovat s relacemi tak, jak jsme zvyklí z relačních databází. V této kapitole si ukážeme, jak s touto skutečností pracovat.

 

Předpokládejme, že máme v databázi dvě provázané tabulky — order a order_product:

idemaildatestatus
1john.s@icloud.com2022-02-20delivered
2jorge.c@gmail.com2022-02-21new
idorder_idnameprice
241OttLite Achieve Desk Lamp49.97
251TOPS Pen Pal Flexible Pen Holders3.36
262Pen+Gear Plastic Storage Box1.24

 

V Elasticsearch bohužel není možné provést dotaz s JOIN, který by spojil výsledky z dvou indexů.

Řešením je provést spojení ještě předtím, než se data do Elasticsearch uloží a ukládat je tak v denormalizované podobě.

Pro uložení takového dokumentu do Elasticsearch by bylo nutné vytvořit následující JSON:

Přestože lze tento dokument uložit do Elasticsearch tak jak je, v některých případech se bude chovat neočekávaně.

Například, pokud zkusíme vyhledat objednávky, které obsahují produkt, jehož name začíná OttLite a zároveň je jeho price menší než 10.

V tomto případě by byl dokument nalezen, i když je první podmínka splněna jen u prvního produktu, zatímco druhá podmínka platí pouze pro druhy (odlišný) produkt.

Anychom toto chování napravili, pole products musí být typu nested:

Následně při vyhledávání v nested objektu musíme i samotný dotaz zabalit do nested query:

Totéž platí pro agregace, kdy bude nutné dílčí agregace obalit speciální agregaci nested.