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

 

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.

In this case, such a document would be found, even though the first condition is met only in the first product, while the second condition applies only to the second (different) product.

To fix it, a mapping for a field products must be set to a type nested:

Then, when searching in a nested object, you have to wrap your query into a nested query:

The same applies to aggregations — you should use a nested aggregation as a wrapper for other queries.