Elasticsearch中nested聚合操作
發(fā)布時間:2021-11-24 點擊數(shù):944
ElasticSearch簡介(也稱ES)
Elasticsearch 是一個分布式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎上的搜索引擎.當然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全文搜索功能,還可以進行以下工作:
- 分布式實時文件存儲,并將每一個字段都編入索引,使其可以被搜索。
- 實時分析的分布式搜索引擎。
- 可以擴展到上百臺服務器,處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。
ElasticSearch數(shù)據(jù)類型
一級分類 | 二級分類 | 具體類型 |
---|---|---|
基礎類型 | 字符串類型 | string,text,keyword |
-- | 整數(shù)類型 | integer,long,short,byte |
-- | 邏輯類型 | boolean |
-- | 浮點類型 | double,float,half_float,scaled_float |
-- | 日期類型 | date |
-- | 范圍類型 | range |
-- | 二進制類型 | binary |
復合類型 | 數(shù)組類型 | array |
-- | 對象類型 | object |
-- | 嵌套類型 | nested |
地理類型 | 地理坐標類型 | geo_point |
-- | 地理地圖 | geo_shape |
特殊類型 | IP類型 | ip |
-- | 范圍地圖 | completion |
-- | 令牌計數(shù)類型 | token_count |
-- | 附件地圖 | attachment |
-- | 抽取類型 | percolator |
以上便是ES中的數(shù)據(jù)類型,下面便對其中的object和nested來做一個簡單的介紹。
nested介紹
nested就是一個嵌套對象,是object數(shù)據(jù)類型的特殊版本,它允許對象數(shù)組相互獨立地進行索引和查詢,使用時和其他類型使用基本相同,下面便是我來舉的一個例子,labels便是一個nested類型的數(shù)據(jù)
{ "settings": { "index": { "codec": "best_compression", "mapping": { "nested_fields": { "limit": "2000" }, "total_fields": { "limit": "10000" }
}, "refresh_interval": "1s", "number_of_shards": "2", "translog": { "flush_threshold_size": "1gb", "sync_interval": "30s", "durability": "async" }, "number_of_replicas": "1" }
}, "mappings": { "dynamic": true, "properties": { "id": { "type": "long", "doc_values": false, "index": false }, "name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "provinces": { "type": "keyword", "doc_values": false }, "city": { "type": "keyword" }, "permissionLevel": { "type": "integer", "doc_values": false, "index": false }, "status": { "type": "integer" }, "labels": { "type": "nested", "properties": { "label": { "type": "keyword" }, "classification": { "type": "keyword" }
}
}
}
}
}
當需要使用這個嵌套類型中的數(shù)據(jù)進行過濾,統(tǒng)計時我們普遍會使用這個來做一個聚合查詢,但是這個會出現(xiàn)一個問題,那便是,所聚合出來的數(shù)據(jù)只是nested對象的數(shù)據(jù),而外部主體數(shù)據(jù)并沒有聚合出來那便是一個問題
{ "size": 0, "query": { "bool": { "must": [
{ "nested": { "path": "labels", "query": { "term": { "labels.classification": "行業(yè)" }
}
}
}
]
}
}, "aggs": { "genres": { "nested": { "path": "labels" }, "aggs": { "label_agg": { "terms": { "field": "labels.label" }, "aggs": { "count_sub": { "sum": { "field": "viewCpount" }
}
}
}, "fll": { "filter": { "term": { "labels.classification": "行業(yè)" }
}, "aggs": { "label_agg2": { "terms": { "field": "labels.label" }
}
}
}
}
}
}
}
之后,通過對官網(wǎng)文檔,還有同事的討論,當對nested對象使用聚合查詢時,便需要時用reverse_nested,來回到root主體。這樣便能夠?qū)ested之外的數(shù)據(jù)來進行聚合操作了。
{ "size": 0, "query": { "bool": { "must": [
{ "nested": { "path": "labels", "query": { "term": { "labels.classification": "c1" }
}
}
}
]
}
}, "aggs": { "genres": { "nested": { "path": "labels" }, "aggs": { "fll": { "filter": { "term": { "labels.classification": "c1" }
}, "aggs": { "label_agg2": { "terms": { "field": "labels.label" }, "aggs": { "res": { "reverse_nested": {}, "aggs": { "count_view": { "sum": { "field": "viewCount" }
}
}
}
}
}
}
}
}
}
}
}```