Consulta agregada de Elasticsearch basada en el índice de tipo anidado de la estructura de matriz

He estado haciendo consultas de agregación en ES estos días. Encontré algunos problemas al consultar datos de uno a muchos productos. Permítanme hacer un registro.

1.La estructura de datos del documento ES es la siguiente

=====doc 文档一
{
    "id": "IEO29R12KN912NDF893",
    "products": [
        {
            "product_name": "电视机",
            "budget": 2000
        },
        {
            "product_name": "手机",
            "budget": 851
        }
    ],
    "publish_year": "2020"
}
=====doc 文档二
{
    "id": "IQFJ019238AHJDFK1L9",
    "products": [
        {
            "product_name": "电视机",
            "budget": 2000
        },
        {
            "product_name": "相机",
            "budget": 5000
        },
        {
            "product_name": "扑克牌",
            "budget": 2
        }
    ],
    "publish_year": "2019"
}

2. El resultado de mi requisito de consulta es

Agrupe para cada nombre de producto [ nombre_producto ] y sume el presupuesto [ presupuesto ]

3. Mis resultados de consulta esperados

nombre del producto Presupuesto
televisor 4000
Teléfono móvil 851
cámara 5000
jugando a las cartas 2

4. Consulta y resultados incorrectos

4.1 Consulta de declaraciones y resultados

declaración de consulta es == versión simplificada

{
    
    
  "from": 0,
  "size": 14,
  "aggs": {
    
    
    "aggs_of_product": {
    
    
      "terms": {
    
    
        "field": "products.product_name.keyword"
      },
      "aggs": {
    
    
        "aggs_sum_of_budget": {
    
    
          "sum": {
    
    
            "field": "products.budget"
          }
        }
      }
    }
  }doc 文档二
}

resultados de la consulta es == versión simplificada

{
    
    
    "aggregations": {
    
    
        "aggs_of_product": {
    
    
            "buckets": [
                {
    
    
                    "key": "电视机",
                    "doc_count": 2,
                    "aggs_sum_of_budget": {
    
    
                        "value": 9853
                    }
                },
                {
    
    
                    "key": "手机",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
    
    
                        "value": 2851
                    }
                },
                {
    
    
                    "key": "相机",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
    
    
                        "value": 7002
                    }
                },
                {
    
    
                    "key": "扑克牌",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
    
    
                        "value": 7002
                    }
                }
            ]
        }
    }
}

4.2 Causa del error

Tenga en cuenta que el doc_count del televisor es 2. Aquí podemos sacar conclusiones basadas en el presupuesto del televisor, la cámara y las cartas. Tome la cámara como ejemplo: el valor total que calcula es la suma de todos los presupuestos de los productos en [ documento doc 2 ] que llegaron a la cámara . La consulta de agregación es aquí no se aplica aquí.

Si solo hay un producto en un documento, entonces el resultado de esta consulta es correcto.

5.Solución

Después de muchas búsquedas en Google y Baidu, descubrí un problema. Mi idea de cálculo era correcta. El problema principal era el tipo de campo de productos. Al principio, el tipo de productos era el predeterminado, y luego fue necesario cambiarlo. se puede cambiar al tipo anidado [anidado].

5.1 Modificación del mapeo de índice de campo

Mapeo de productos anteriores

{
    
    
    "mappings": {
    
    
        "properties": {
    
    
            "products": {
    
    
                "properties": {
    
    
                    "product_name": {
    
    
                        "type": "text",
                        "fields": {
    
    
                            "keyword": {
    
    
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "budget": {
    
    
                        "type": "float"
                    }
                }
            }
        }
    }
}

Mapeo después de modificar productos

Cambie el tipo de campo de productos a tipo anidado anidado.
Un "tipo" más: "anidado"

{
    
    
    "mappings": {
    
    
        "properties": {
    
    
            "products": {
    
    
                "type": "nested",
                "properties": {
    
    
                    "product_name": {
    
    
                        "type": "text",
                        "fields": {
    
    
                            "keyword": {
    
    
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "budget": {
    
    
                        "type": "float"
                    }
                }
            }
        }
    }
}

5.2 Declaración de consulta es modificada

{
    
    
    "aggs": {
    
    
        "nested_name": {
    
    
            "nested": {
    
    
                "path": "products"
            },
            "aggs": {
    
    
                "aggs_of_product": {
    
    
                    "terms": {
    
    
                        "field": "products.product_name.keyword"     
                    },
                    "aggs": {
    
    
                        "aggs_sum_of_budget": {
    
    
                            "sum": {
    
    
                                "field": "products.budget"
                            }
                        }
                    }
                }
            }
        }
    }
}

5.3 Resultados de consulta modificados

{
    
    
    "aggregations": {
    
    
        "aggr_field_product": {
    
    
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 36126,
            "buckets": [
                {
    
    
                    "key": "电视机",
                    "doc_count": 2,
                    "sum_eventTime": {
    
    
                        "value": 4000
                    }
                },
                {
    
    
                    "key": "手机",
                    "doc_count": 1,
                    "sum_eventTime": {
    
    
                        "value": 851
                    }
                },
                {
    
    
                    "key": "相机",
                    "doc_count": 1,
                    "sum_eventTime": {
    
    
                        "value": 5000
                    }
                },
                {
    
    
                    "key": "扑克牌",
                    "doc_count": 1,
                    "sum_eventTime": {
    
    
                        "value": 2
                    }
                }
            ]
        }
    }
}

6. Materiales de referencia
stackoverflow-nested-array-of-objects-aggregation-in-elasticsearch
Elasticsearch 7.x Consulta de tipo anidado anidado - Zhihu
Elasticsearch Explicación detallada del tipo anidado

Supongo que te gusta

Origin blog.csdn.net/weixin_42581660/article/details/128560202
Recomendado
Clasificación