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.