Novatos con ElasticSearch tenemos documentos indexados con la siguiente estructura:

{
    "Id": 1246761,
    "ContentTypeName": "Official Statement",
    "Title": "Official statement Title",    
    "Categories": [
        {
            "Id": 3,
            "Type": 1,
            "Name": "Category A",
            "ParentId": 0
        },
        {
            "Id": 10,
            "Type": 3,
            "Name": "Category B",
            "ParentId": 0
        },
        {
            "Id": 426,
            "Type": 7,
            "Name": "Category C",
            "ParentId": 0
        }
    ]
}

El requisito es obtener la lista agregada de categorías + el recuento de documentos que coinciden con una búsqueda por palabra clave. Hasta ahora, nuestra consulta se ve así:

GET _search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "my-agg-name": {
      "terms": {
        "field": "Categories.Id"
      }
    }
  }
}

El resultado es

{
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "my-agg-name" : {
      "doc_count_error_upper_bound" : 23845,
      "sum_other_doc_count" : 1068245,
      "buckets" : [
        {
          "key" : 426,
          "doc_count" : 112651
        },
        {
          "key" : 10,
          "doc_count" : 91146
        },
        
        ....
      ]
    }
  }
}

¿Hay alguna forma de recuperar todo el objeto Categoría, no solo el Id? ¿O serializar el objeto de categoría en una cadena como clave?

1
MarcusReignh 22 ene. 2021 a las 18:18

1 respuesta

La mejor respuesta

Debe utilizar agregación anidada para lograr su caso de uso requerido

Agregar un ejemplo de trabajo con mapeo de índices, consulta de búsqueda y resultado de búsqueda

Asignación de índice:

{
  "mappings": {
    "properties": {
      "Categories": {
        "type": "nested"
      }
    }
  }
}

Consulta de búsqueda:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "resellers": {
      "nested": {
        "path": "Categories"
      },
      "aggs": {
        "my-agg-name": {
          "terms": {
            "field": "Categories.Id"
          },
          "aggs": {
            "categories-doc": {
              "top_hits": {
                "_source": {
                  "includes": [
                    "Categories.Id",
                    "Categories.Type",
                    "Categories.Name",
                    "Categories.ParentId"
                  ]
                },
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}

Resultado de búsqueda:

"aggregations": {
    "resellers": {
      "doc_count": 3,
      "my-agg-name": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 3,                    // note this
            "doc_count": 1,
            "categories-doc": {
              "hits": {
                "total": {
                  "value": 1,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "65847850",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "Categories",
                      "offset": 0
                    },
                    "_score": 1.0,
                    "_source": {
                      "ParentId": 0,
                      "Type": 1,
                      "Id": 3,                     // note this
                      "Name": "Category A"
                    }
                  }
                ]
              }
            }
          },
          {
            "key": 10,
            "doc_count": 1,
            "categories-doc": {
              "hits": {
                "total": {
                  "value": 1,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "65847850",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "Categories",
                      "offset": 1
                    },
                    "_score": 1.0,
                    "_source": {
                      "ParentId": 0,
                      "Type": 3,
                      "Id": 10,
                      "Name": "Category B"
                    }
                  }
                ]
              }
            }
          },
          {
            "key": 426,
            "doc_count": 1,
            "categories-doc": {
              "hits": {
                "total": {
                  "value": 1,
                  "relation": "eq"
                },
                "max_score": 1.0,
                "hits": [
                  {
                    "_index": "65847850",
                    "_type": "_doc",
                    "_id": "1",
                    "_nested": {
                      "field": "Categories",
                      "offset": 2
                    },
                    "_score": 1.0,
                    "_source": {
                      "ParentId": 0,
                      "Type": 7,
                      "Id": 426,
                      "Name": "Category C"
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    }
  }
1
ESCoder 22 ene. 2021 a las 16:15