Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment configurer la structure d'index ElasticSearch avec plusieurs liaisons d'entités

C'est un bon début !

Je voudrais certainement tout aplatir (c'est-à-dire denormalize ) et créez des documents de produit qui ressemblent à celui ci-dessous. De cette façon, vous vous débarrassez de la relation N:M entre les produits et les drapeaux en créant simplement un flags tableau pour chaque produit. Il sera ainsi plus facile d'interroger ces drapeaux.

{
   "id": "00c8234d71c4e94f725cd432ebc04",
   "title": "Alpha",
   "price": 589.0,
   "flags": ["Sellout", "Top Product"]
}
{
   "id": "018357657529fef056cf396626812",
   "title": "Beta",
   "price": 355.0,
   "flags": ["Discount"]
}
{
   "id": "01a2c32ceeff0fc6b7dd4fc4302ab",
   "title": "Gamma",
   "price": 0.0,
   "flags": ["Discount"]
}

Le type de mappage de produit ressemblerait à ceci :

PUT products
{
    "mappings": {
        "product": {
            "properties": {
                "id": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "title": {
                    "type": "string"
                },
                "price": {
                    "type": "double",
                    "null_value": 0.0
                },
                "flags": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

Puisque vous avez le logstash jdbc entrée déjà, il ne vous manque plus que la requête SQL appropriée pour récupérer les produits et les drapeaux associés.

  SELECT p.Id as id, p.Title as title, p.Price as price, GROUP_CONCAT(f.Title) as flags
    FROM Products p
    JOIN flagsProducts fp ON fp.ProductId = p.Id
    JOIN Flags f ON fp.FlagId = f.id
GROUP BY p.Id

Ce qui vous donnerait des lignes comme celles-ci :

+-------------------------------+-------+-------+---------------------+
| id                            | title | price | flags               |
+-------------------------------+-------+-------+---------------------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha |   589 | Sellout,Top product |
| 018357657529fef056cf396626812 | Beta  |   355 | Discount            |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma |     0 | Discount            |
+-------------------------------+-------+-------+---------------------+

En utilisant les filtres Logstash, vous pouvez ensuite diviser les flags dans un tableau et vous êtes prêt à partir.