Elasticsearch 分组统计aggs

495 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

最近在做一个数据清洗的项目,需要将xml数据清洗统计,在前期技术调研时选择了Elastic Search 作为数据存储数据库,ELasticSearch强大的数据分析能力可以满足大多数大数据存储和统计的需要。

mapping结构

 {
			"properties": {
				"eventID": {
					"type": "keyword"
				},
				"evtBasic": {
					"type": "nested",
					"properties": {
						"JZDWBM": {
							"type": "keyword"
						},
						"JZDWMC": {
							"type": "text",
							"fields": {
								"keyword": {
									"type": "keyword",
									"ignore_above": 256
								}
							}
						},
						"TYSHXYDMJZDW": {
							"type": "text",
							"fields": {
								"keyword": {
									"type": "keyword",
									"ignore_above": 256
								}
							}
						},
						"itemDetail": {
							"properties": {
								"GJYPBSM": {
									"type": "keyword"
								},
								"JKYMDLQYMC": {
									"type": "text",
									"fields": {
										"keyword": {
											"type": "keyword",
											"ignore_above": 256
										}
									}
								},
								"SCQYMC": {
									"type": "text",
									"fields": {
										"keyword": {
											"type": "keyword",
											"ignore_above": 256
										}
									}
								},
								"SCRQ": {
									"type": "date",
									"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis ||yyyyMMdd"
								},
								"SYRQ": {
									"type": "date",
									"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis ||yyyyMMdd"
								},
								"SYSL": {
									"type": "long"
								},
								"TYSHXYDMJKYMDLQY": {
									"type": "keyword"
								},
								"TYSHXYDMSCQY": {
									"type": "keyword"
								},
								"YMSCPH": {
									"type": "text",
									"fields": {
										"keyword": {
											"type": "keyword",
											"ignore_above": 256
										}
									}
								},
								"YMYXQJZRQ": {
									"type": "date",
									"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis ||yyyyMMdd"
								},
								"YPPZWH": {
									"type": "text",
									"fields": {
										"keyword": {
											"type": "keyword",
											"ignore_above": 256
										}
									}
								},
								"YPTYMC": {
									"type": "text",
									"fields": {
										"keyword": {
											"type": "keyword",
											"ignore_above": 256
										}
									}
								},
								"instanceList": {
									"properties": {
										"instanceDetail": {
											"properties": {
												"SYSJ": {
													"type": "date",
													"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis ||yyyyMMdd"
												},
												"YFJZDABH": {
													"type": "keyword"
												},
												"YMZT": {
													"type": "keyword"
												},
												"YPZSM": {
													"type": "keyword"
												}
											}
										}
									}
								}
							}
						}
					}
				},
				"recTime": {
					"type": "date",
					"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis"
				}
			}
		}

nested类型数据简单查询


{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": { #如果是nested数据类型此处必须声明
                        "path": "evtBasic", #此处为nested根节点
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "match_phrase": {
                                            "evtBasic.JZDWMC": "北京"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}

nested类型数据aggs统计

{
    "size": 0, #此处设置为0可以使结果中不显示_source
    "aggs": {
        "wordgroup": {
            "nested": {
                "path": "evtBasic"
            },
            "aggs": {
                "word": {
                    "terms": {
                        "field": "evtBasic.KCJGMC.keyword", #由于字段为text不能直接用于聚合,需要使用keyword声明
                        "size": 100000, #这需要设置需要统计的文档数,数据量大的话就会出现结果中数据统计不全
                        "order": {
                            "wordnum": "desc"
                        }
                    },
                    "aggs": {
                        "wordnum": {
                            "sum": {
                                "field": "evtBasic.itemDetail.KCSL"
                            }
                        }
                    }
                }
            }
        }
    }
}