AWS Opensearch: How to aggregate by properties of a composite element

67 Views Asked by At

Hello to all Opeansearch expert.

Here is my issue:

I've got a document whose mapping has been done in a way to have an array of composite properties called datasheet, each of them can have a title and a value, like the following

{
  "products": {
    "description": {
      "type": "text",
         "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
         }
      }
   },
   "datasheet": {
      "properties": {
        "title": {
          "type": "keyword"
         },
         "value": {
          "type": "keyword"
         }
      }
    }
 }

Here is an example of two documents stored in my index:

{
  "_id": "01",
  "description": "PLACCA 1M BIANCO",
  "datasheet": [
    {
      "title": "numero di elementi di commutazione",
      "value": "0"
    },
    {
      "title": "diametro del foro (apertura)",
      "value": "0"
    },
    {
      "title": "Trattamento superficie",
      "value": "non trattato"
    },
    {
      "title": "qualità del materiale",
      "value": "materiale termoplastico"
    },
    {
      "title": "Materiale",
      "value": "plastica"
    },
    {
      "title": "direzione di montaggio",
      "value": "orizzontale e verticale"
    },
    {
      "title": "codice RAL (simile)",
      "value": "9016"
    },
    {
      "title": "Larghezza",
      "value": "80"
    },
    {
      "title": "Altezza",
      "value": "80"
    },
    {
      "title": "profondità",
      "value": "9"
    },
    {
      "title": "larghezza di montaggio",
      "value": "80"
    },
    {
      "title": "Altezza della parte incassata",
      "value": "80"
    },
    {
      "title": "numero di unità",
      "value": "1"
    },
    {
      "title": "con cornice di montaggio",
      "value": "si"
    },
    {
      "title": "numero di unità orizzontali",
      "value": "1"
    },
    {
      "title": "numero di unità verticali",
      "value": "1"
    },
    {
      "title": "numero dei moduli in orizzontale (per costruzione modulare)",
      "value": "1"
    },
    {
      "title": "numero dei moduli in verticale (per costruzione modulare)",
      "value": "1"
    },
    {
      "title": "tipo di fissaggio",
      "value": "fissaggio a morsetto"
    },
    {
      "title": "grado di protezione (IP)",
      "value": "IP00"
    },
    {
      "title": "colore",
      "value": "bianco"
    },
    {
      "title": "Tipo superficie",
      "value": "brillante"
    },
    {
      "title": "casella di testo/superficie di marcatura",
      "value": "si"
    },
    {
      "title": "senza alogeni",
      "value": "si"
    },
    {
      "title": "trasparente",
      "value": "no"
    },
    {
      "title": "con coperchio a cerniera",
      "value": "no"
    },
    {
      "title": "adatto per installazione a incasso",
      "value": "si"
    },
    {
      "title": "adatto per canale da incasso per apparecchi",
      "value": "si"
    },
    {
      "title": "adatto per scatola di canale sotterraneo",
      "value": "si"
    }
  ]
}



{
  "_id": "02",
  "description": "PLACCA 1M AVORIO",
  "datasheet": [
    {
      "title": "casella di testo/superficie di marcatura",
      "value": "si"
    },
    {
      "title": "adatto per canale da incasso per apparecchi",
      "value": "si"
    },
    {
      "title": "adatto per scatola di canale sotterraneo",
      "value": "si"
    },
    {
      "title": "con cornice di montaggio",
      "value": "si"
    },
    {
      "title": "diametro del foro (apertura)",
      "value": "0"
    },
    {
      "title": "Altezza della parte incassata",
      "value": "80"
    },
    {
      "title": "larghezza di montaggio",
      "value": "80"
    },
    {
      "title": "profondità",
      "value": "9"
    },
    {
      "title": "Altezza",
      "value": "80"
    },
    {
      "title": "Larghezza",
      "value": "80"
    },
    {
      "title": "codice RAL (simile)",
      "value": "9002"
    },
    {
      "title": "numero di elementi di commutazione",
      "value": "0"
    },
    {
      "title": "numero dei moduli in verticale (per costruzione modulare)",
      "value": "1"
    },
    {
      "title": "numero dei moduli in orizzontale (per costruzione modulare)",
      "value": "1"
    },
    {
      "title": "numero di unità verticali",
      "value": "1"
    },
    {
      "title": "numero di unità orizzontali",
      "value": "1"
    },
    {
      "title": "numero di unità",
      "value": "1"
    },
    {
      "title": "qualità del materiale",
      "value": "materiale termoplastico"
    },
    {
      "title": "Trattamento superficie",
      "value": "non trattato"
    },
    {
      "title": "Tipo superficie",
      "value": "brillante"
    },
    {
      "title": "colore",
      "value": "bianco"
    },
    {
      "title": "grado di protezione (IP)",
      "value": "IP00"
    },
    {
      "title": "tipo di fissaggio",
      "value": "fissaggio a morsetto"
    },
    {
      "title": "direzione di montaggio",
      "value": "orizzontale e verticale"
    },
    {
      "title": "Materiale",
      "value": "plastica"
    },
    {
      "title": "con coperchio a cerniera",
      "value": "no"
    },
    {
      "title": "trasparente",
      "value": "no"
    },
    {
      "title": "senza alogeni",https://stackoverflow.com/posts/77297386/edit#
      "value": "si"
    },
    {
      "title": "adatto per installazione a incasso",
      "value": "si"
    }
  ]
}

As you can see, each datasheet properties is a combination of a title and a value. Usually, many documents can have datasheet.title in common, but the value might be different.

Question
I would like to aggregate the documents by the property datasheet, in a way to group all the datasheet.title first, and for each of them I want to aggregate all related datasheet.value (i.e a sort of SQL group by of two columns).

Is it possible to do that? Which type of aggregation do you suggest? Would you mind helping me with an example?

I tried with many types of aggregation, like "terms", "nested", "multi_terms", etc.. but no one gave me the expected results. Perhaps I am using any of them in a wrong way. It would be appreciated any of your suggestion.

Thanks a lot in advance for your time and support.

0

There are 0 best solutions below