sql >> Database >  >> RDS >> Mysql

ElasticSearch-indexstructuur instellen met bindingen met meerdere entiteiten

Dat is een goed begin!

Ik zou het zeker allemaal afvlakken (d.w.z. denormaliseren ) en bedenk productdocumenten die er als volgt uitzien. Op die manier ontdoe je je van de N:M-relatie tussen producten en vlaggen door simpelweg een flags te maken array voor elk product. Het zal dus gemakkelijker zijn om die vlaggen op te vragen.

{
   "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"]
}

Het type producttoewijzing ziet er als volgt uit:

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"
                }
            }
        }
    }
}

Aangezien je de logstash jdbc . hebt invoer al, alles wat je mist is de juiste SQL-query om de producten en bijbehorende vlaggen op te halen.

  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

Waardoor je rijen als deze krijgt:

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

Met behulp van Logstash-filters kunt u vervolgens de flags splitsen in een array en je bent klaar om te gaan.




  1. werk met json in orakel

  2. De eenvoudigste manier om meerdere spaties toe te voegen aan een string in MySQL - SPACE()

  3. SCD-type 1

  4. Hoe kan ik weten of er een SQL-uitzondering is gegenereerd vanwege een schending van een externe sleutel?