mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-27 05:36:42 +08:00
1010 lines
34 KiB
HTML
1010 lines
34 KiB
HTML
<!DOCTYPE html>
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
<link rel="icon" href="/static/favicon.png">
|
||
<title>11 聚合:聚合查询之Metric聚合详解.md.html</title>
|
||
<!-- Spectre.css framework -->
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
<!-- theme css & js -->
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
</head>
|
||
<body>
|
||
<div class="book-container">
|
||
<div class="book-sidebar">
|
||
<div class="book-brand">
|
||
<a href="/">
|
||
<img src="/static/favicon.png">
|
||
<span>技术文章摘抄</span>
|
||
</a>
|
||
</div>
|
||
<div class="book-menu uncollapsible">
|
||
<ul class="uncollapsible">
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
<li><a href="../">上一级</a></li>
|
||
</ul>
|
||
<ul class="uncollapsible">
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/01 认知:ElasticSearch基础概念.md.html">01 认知:ElasticSearch基础概念</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/02 认知:Elastic Stack生态和场景方案.md.html">02 认知:Elastic Stack生态和场景方案</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/03 安装:ElasticSearch和Kibana安装.md.html">03 安装:ElasticSearch和Kibana安装</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/04 入门:查询和聚合的基础使用.md.html">04 入门:查询和聚合的基础使用</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/05 索引:索引管理详解.md.html">05 索引:索引管理详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/06 索引:索引模板(Index Template)详解.md.html">06 索引:索引模板(Index Template)详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/07 查询:DSL查询之复合查询详解.md.html">07 查询:DSL查询之复合查询详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/08 查询:DSL查询之全文搜索详解.md.html">08 查询:DSL查询之全文搜索详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/09 查询:DSL查询之Term详解.md.html">09 查询:DSL查询之Term详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/10 聚合:聚合查询之Bucket聚合详解.md.html">10 聚合:聚合查询之Bucket聚合详解</a>
|
||
</li>
|
||
<li>
|
||
<a class="current-tab" href="/专栏/ElasticSearch知识体系详解/11 聚合:聚合查询之Metric聚合详解.md.html">11 聚合:聚合查询之Metric聚合详解</a>
|
||
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/12 聚合:聚合查询之Pipline聚合详解.md.html">12 聚合:聚合查询之Pipline聚合详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/13 原理:从图解构筑对ES原理的初步认知.md.html">13 原理:从图解构筑对ES原理的初步认知</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/14 原理:ES原理知识点补充和整体结构.md.html">14 原理:ES原理知识点补充和整体结构</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/15 原理:ES原理之索引文档流程详解.md.html">15 原理:ES原理之索引文档流程详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/16 原理:ES原理之读取文档流程详解.md.html">16 原理:ES原理之读取文档流程详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/17 优化:ElasticSearch性能优化详解.md.html">17 优化:ElasticSearch性能优化详解</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/18 大厂实践:腾讯万亿级 Elasticsearch 技术实践.md.html">18 大厂实践:腾讯万亿级 Elasticsearch 技术实践</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/19 资料:Awesome Elasticsearch.md.html">19 资料:Awesome Elasticsearch</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/20 WrapperQuery.md.html">20 WrapperQuery</a>
|
||
</li>
|
||
<li>
|
||
<a href="/专栏/ElasticSearch知识体系详解/21 备份和迁移.md.html">21 备份和迁移</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
<div class="sidebar-toggle-inner"></div>
|
||
</div>
|
||
<script>
|
||
function add_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.add('show')
|
||
}
|
||
function remove_inner() {
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
inner.classList.remove('show')
|
||
}
|
||
function sidebar_toggle() {
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let content = document.querySelector('.off-canvas-content')
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
sidebar_toggle.classList.remove('extend')
|
||
sidebar.classList.remove('hide')
|
||
content.classList.remove('extend')
|
||
} else { // hide
|
||
sidebar_toggle.classList.add('extend')
|
||
sidebar.classList.add('hide')
|
||
content.classList.add('extend')
|
||
}
|
||
}
|
||
function open_sidebar() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.add('show')
|
||
overlay.classList.add('show')
|
||
}
|
||
function hide_canvas() {
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
sidebar.classList.remove('show')
|
||
overlay.classList.remove('show')
|
||
}
|
||
</script>
|
||
<div class="off-canvas-content">
|
||
<div class="columns">
|
||
<div class="column col-12 col-lg-12">
|
||
<div class="book-navbar">
|
||
<!-- For Responsive Layout -->
|
||
<header class="navbar">
|
||
<section class="navbar-section">
|
||
<a onclick="open_sidebar()">
|
||
<i class="icon icon-menu"></i>
|
||
</a>
|
||
</section>
|
||
</header>
|
||
</div>
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
overflow-x: auto;
|
||
overflow-y: hidden;">
|
||
<div class="book-post">
|
||
<p id="tip" align="center"></p>
|
||
<div><h1>11 聚合:聚合查询之Metric聚合详解</h1>
|
||
<h2>如何理解metric聚合</h2>
|
||
<blockquote>
|
||
<p>在[bucket聚合]中,我画了一张图辅助你构筑体系,那么metric聚合又如何理解呢?</p>
|
||
</blockquote>
|
||
<p>如果你直接去看官方文档,大概也有十几种:</p>
|
||
<p><img src="assets/es-agg-metric-1.png" alt="img" /></p>
|
||
<blockquote>
|
||
<p>那么metric聚合又如何理解呢?我认为从两个角度:</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li><strong>从分类看</strong>:Metric聚合分析分为<strong>单值分析</strong>和<strong>多值分析</strong>两类</li>
|
||
<li><strong>从功能看</strong>:根据具体的应用场景设计了一些分析api, 比如地理位置,百分数等等</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>融合上述两个方面,我们可以梳理出大致的一个mind图:</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>
|
||
<p>单值分析</p>
|
||
<p>: 只输出一个分析结果</p>
|
||
<ul>
|
||
<li>标准stat型
|
||
<ul>
|
||
<li><code>avg</code> 平均值</li>
|
||
<li><code>max</code> 最大值</li>
|
||
<li><code>min</code> 最小值</li>
|
||
<li><code>sum</code> 和</li>
|
||
<li><code>value_count</code> 数量</li>
|
||
</ul>
|
||
</li>
|
||
<li>其它类型
|
||
<ul>
|
||
<li><code>cardinality</code> 基数(distinct去重)</li>
|
||
<li><code>weighted_avg</code> 带权重的avg</li>
|
||
<li><code>median_absolute_deviation</code> 中位值</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>多值分析</p>
|
||
<p>: 单值之外的</p>
|
||
<ul>
|
||
<li>stats型
|
||
<ul>
|
||
<li><code>stats</code> 包含avg,max,min,sum和count</li>
|
||
<li><code>matrix_stats</code> 针对矩阵模型</li>
|
||
<li><code>extended_stats</code></li>
|
||
<li><code>string_stats</code> 针对字符串</li>
|
||
</ul>
|
||
</li>
|
||
<li>百分数型
|
||
<ul>
|
||
<li><code>percentiles</code> 百分数范围</li>
|
||
<li><code>percentile_ranks</code> 百分数排行</li>
|
||
</ul>
|
||
</li>
|
||
<li>地理位置型
|
||
<ul>
|
||
<li><code>geo_bounds</code> Geo bounds</li>
|
||
<li><code>geo_centroid</code> Geo-centroid</li>
|
||
<li><code>geo_line</code> Geo-Line</li>
|
||
</ul>
|
||
</li>
|
||
<li>Top型
|
||
<ul>
|
||
<li><code>top_hits</code> 分桶后的top hits</li>
|
||
<li><code>top_metrics</code></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p><strong>通过上述列表(我就不画图了),我们构筑的体系是基于分类和功能,而不是具体的项(比如avg,percentiles...);这是不同的认知维度: 具体的项是碎片化,分类和功能这种是你需要构筑的体系</strong>。@pdai</p>
|
||
</blockquote>
|
||
<h2>单值分析: 标准stat类型</h2>
|
||
<h3><code>avg</code> 平均值</h3>
|
||
<p>计算班级的平均分</p>
|
||
<pre><code class="language-bash">POST /exams/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"avg_grade": { "avg": { "field": "grade" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"avg_grade": {
|
||
"value": 75.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>max</code> 最大值</h3>
|
||
<p>计算销售最高价</p>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"max_price": { "max": { "field": "price" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"max_price": {
|
||
"value": 200.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>min</code> 最小值</h3>
|
||
<p>计算销售最低价</p>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"min_price": { "min": { "field": "price" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"min_price": {
|
||
"value": 10.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>sum</code> 和</h3>
|
||
<p>计算销售总价</p>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"query": {
|
||
"constant_score": {
|
||
"filter": {
|
||
"match": { "type": "hat" }
|
||
}
|
||
}
|
||
},
|
||
"aggs": {
|
||
"hat_prices": { "sum": { "field": "price" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"hat_prices": {
|
||
"value": 450.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>value_count</code> 数量</h3>
|
||
<p>销售数量统计</p>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"aggs" : {
|
||
"types_count" : { "value_count" : { "field" : "type" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"types_count": {
|
||
"value": 7
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2>单值分析: 其它类型</h2>
|
||
<h3><code>weighted_avg</code> 带权重的avg</h3>
|
||
<pre><code class="language-bash">POST /exams/_search
|
||
{
|
||
"size": 0,
|
||
"aggs": {
|
||
"weighted_grade": {
|
||
"weighted_avg": {
|
||
"value": {
|
||
"field": "grade"
|
||
},
|
||
"weight": {
|
||
"field": "weight"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"weighted_grade": {
|
||
"value": 70.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>cardinality</code> 基数(distinct去重)</h3>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"type_count": {
|
||
"cardinality": {
|
||
"field": "type"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"type_count": {
|
||
"value": 3
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>median_absolute_deviation</code> 中位值</h3>
|
||
<pre><code class="language-bash">GET reviews/_search
|
||
{
|
||
"size": 0,
|
||
"aggs": {
|
||
"review_average": {
|
||
"avg": {
|
||
"field": "rating"
|
||
}
|
||
},
|
||
"review_variability": {
|
||
"median_absolute_deviation": {
|
||
"field": "rating"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"review_average": {
|
||
"value": 3.0
|
||
},
|
||
"review_variability": {
|
||
"value": 2.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2>非单值分析:stats型</h2>
|
||
<h3><code>stats</code> 包含avg,max,min,sum和count</h3>
|
||
<pre><code class="language-bash">POST /exams/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"grades_stats": { "stats": { "field": "grade" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"grades_stats": {
|
||
"count": 2,
|
||
"min": 50.0,
|
||
"max": 100.0,
|
||
"avg": 75.0,
|
||
"sum": 150.0
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>matrix_stats</code> 针对矩阵模型</h3>
|
||
<p>以下示例说明了使用矩阵统计量来描述收入与贫困之间的关系。</p>
|
||
<pre><code class="language-bash">GET /_search
|
||
{
|
||
"aggs": {
|
||
"statistics": {
|
||
"matrix_stats": {
|
||
"fields": [ "poverty", "income" ]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"statistics": {
|
||
"doc_count": 50,
|
||
"fields": [ {
|
||
"name": "income",
|
||
"count": 50,
|
||
"mean": 51985.1,
|
||
"variance": 7.383377037755103E7,
|
||
"skewness": 0.5595114003506483,
|
||
"kurtosis": 2.5692365287787124,
|
||
"covariance": {
|
||
"income": 7.383377037755103E7,
|
||
"poverty": -21093.65836734694
|
||
},
|
||
"correlation": {
|
||
"income": 1.0,
|
||
"poverty": -0.8352655256272504
|
||
}
|
||
}, {
|
||
"name": "poverty",
|
||
"count": 50,
|
||
"mean": 12.732000000000001,
|
||
"variance": 8.637730612244896,
|
||
"skewness": 0.4516049811903419,
|
||
"kurtosis": 2.8615929677997767,
|
||
"covariance": {
|
||
"income": -21093.65836734694,
|
||
"poverty": 8.637730612244896
|
||
},
|
||
"correlation": {
|
||
"income": -0.8352655256272504,
|
||
"poverty": 1.0
|
||
}
|
||
} ]
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>extended_stats</code></h3>
|
||
<p>根据从汇总文档中提取的数值计算统计信息。</p>
|
||
<pre><code class="language-bash">GET /exams/_search
|
||
{
|
||
"size": 0,
|
||
"aggs": {
|
||
"grades_stats": { "extended_stats": { "field": "grade" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>上面的汇总计算了所有文档的成绩统计信息。聚合类型为extended_stats,并且字段设置定义将在其上计算统计信息的文档的数字字段。</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"grades_stats": {
|
||
"count": 2,
|
||
"min": 50.0,
|
||
"max": 100.0,
|
||
"avg": 75.0,
|
||
"sum": 150.0,
|
||
"sum_of_squares": 12500.0,
|
||
"variance": 625.0,
|
||
"variance_population": 625.0,
|
||
"variance_sampling": 1250.0,
|
||
"std_deviation": 25.0,
|
||
"std_deviation_population": 25.0,
|
||
"std_deviation_sampling": 35.35533905932738,
|
||
"std_deviation_bounds": {
|
||
"upper": 125.0,
|
||
"lower": 25.0,
|
||
"upper_population": 125.0,
|
||
"lower_population": 25.0,
|
||
"upper_sampling": 145.71067811865476,
|
||
"lower_sampling": 4.289321881345245
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>string_stats</code> 针对字符串</h3>
|
||
<p>用于计算从聚合文档中提取的字符串值的统计信息。这些值可以从特定的关键字字段中检索。</p>
|
||
<pre><code class="language-bash">POST /my-index-000001/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"message_stats": { "string_stats": { "field": "message.keyword" } }
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"message_stats": {
|
||
"count": 5,
|
||
"min_length": 24,
|
||
"max_length": 30,
|
||
"avg_length": 28.8,
|
||
"entropy": 3.94617750050791
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2>非单值分析:百分数型</h2>
|
||
<h3><code>percentiles</code> 百分数范围</h3>
|
||
<p>针对从聚合文档中提取的数值计算一个或多个百分位数。</p>
|
||
<pre><code class="language-bash">GET latency/_search
|
||
{
|
||
"size": 0,
|
||
"aggs": {
|
||
"load_time_outlier": {
|
||
"percentiles": {
|
||
"field": "load_time"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>默认情况下,百分位度量标准将生成一定范围的百分位:[1,5,25,50,75,95,99]。</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"load_time_outlier": {
|
||
"values": {
|
||
"1.0": 5.0,
|
||
"5.0": 25.0,
|
||
"25.0": 165.0,
|
||
"50.0": 445.0,
|
||
"75.0": 725.0,
|
||
"95.0": 945.0,
|
||
"99.0": 985.0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>percentile_ranks</code> 百分数排行</h3>
|
||
<p>根据从汇总文档中提取的数值计算一个或多个百分位等级。</p>
|
||
<pre><code class="language-bash">GET latency/_search
|
||
{
|
||
"size": 0,
|
||
"aggs": {
|
||
"load_time_ranks": {
|
||
"percentile_ranks": {
|
||
"field": "load_time",
|
||
"values": [ 500, 600 ]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-bash">{
|
||
...
|
||
"aggregations": {
|
||
"load_time_ranks": {
|
||
"values": {
|
||
"500.0": 90.01,
|
||
"600.0": 100.0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>上述结果表示90.01%的页面加载在500ms内完成,而100%的页面加载在600ms内完成。</p>
|
||
<h2>非单值分析:地理位置型</h2>
|
||
<h3><code>geo_bounds</code> Geo bounds</h3>
|
||
<pre><code class="language-bash">PUT /museums
|
||
{
|
||
"mappings": {
|
||
"properties": {
|
||
"location": {
|
||
"type": "geo_point"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
POST /museums/_bulk?refresh
|
||
{"index":{"_id":1}}
|
||
{"location": "52.374081,4.912350", "name": "NEMO Science Museum"}
|
||
{"index":{"_id":2}}
|
||
{"location": "52.369219,4.901618", "name": "Museum Het Rembrandthuis"}
|
||
{"index":{"_id":3}}
|
||
{"location": "52.371667,4.914722", "name": "Nederlands Scheepvaartmuseum"}
|
||
{"index":{"_id":4}}
|
||
{"location": "51.222900,4.405200", "name": "Letterenhuis"}
|
||
{"index":{"_id":5}}
|
||
{"location": "48.861111,2.336389", "name": "Musée du Louvre"}
|
||
{"index":{"_id":6}}
|
||
{"location": "48.860000,2.327000", "name": "Musée d'Orsay"}
|
||
POST /museums/_search?size=0
|
||
{
|
||
"query": {
|
||
"match": { "name": "musée" }
|
||
},
|
||
"aggs": {
|
||
"viewport": {
|
||
"geo_bounds": {
|
||
"field": "location",
|
||
"wrap_longitude": true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>上面的汇总展示了如何针对具有商店业务类型的所有文档计算位置字段的边界框</p>
|
||
<pre><code class="language-json">{
|
||
...
|
||
"aggregations": {
|
||
"viewport": {
|
||
"bounds": {
|
||
"top_left": {
|
||
"lat": 48.86111099738628,
|
||
"lon": 2.3269999679178
|
||
},
|
||
"bottom_right": {
|
||
"lat": 48.85999997612089,
|
||
"lon": 2.3363889567553997
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>geo_centroid</code> Geo-centroid</h3>
|
||
<pre><code class="language-bash">PUT /museums
|
||
{
|
||
"mappings": {
|
||
"properties": {
|
||
"location": {
|
||
"type": "geo_point"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
POST /museums/_bulk?refresh
|
||
{"index":{"_id":1}}
|
||
{"location": "52.374081,4.912350", "city": "Amsterdam", "name": "NEMO Science Museum"}
|
||
{"index":{"_id":2}}
|
||
{"location": "52.369219,4.901618", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"}
|
||
{"index":{"_id":3}}
|
||
{"location": "52.371667,4.914722", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"}
|
||
{"index":{"_id":4}}
|
||
{"location": "51.222900,4.405200", "city": "Antwerp", "name": "Letterenhuis"}
|
||
{"index":{"_id":5}}
|
||
{"location": "48.861111,2.336389", "city": "Paris", "name": "Musée du Louvre"}
|
||
{"index":{"_id":6}}
|
||
{"location": "48.860000,2.327000", "city": "Paris", "name": "Musée d'Orsay"}
|
||
POST /museums/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"centroid": {
|
||
"geo_centroid": {
|
||
"field": "location"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>上面的汇总显示了如何针对所有具有犯罪类型的盗窃文件计算位置字段的质心。</p>
|
||
<pre><code class="language-json">{
|
||
...
|
||
"aggregations": {
|
||
"centroid": {
|
||
"location": {
|
||
"lat": 51.00982965203002,
|
||
"lon": 3.9662131341174245
|
||
},
|
||
"count": 6
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>geo_line</code> Geo-Line</h3>
|
||
<pre><code class="language-bash">PUT test
|
||
{
|
||
"mappings": {
|
||
"dynamic": "strict",
|
||
"_source": {
|
||
"enabled": false
|
||
},
|
||
"properties": {
|
||
"my_location": {
|
||
"type": "geo_point"
|
||
},
|
||
"group": {
|
||
"type": "keyword"
|
||
},
|
||
"@timestamp": {
|
||
"type": "date"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
POST /test/_bulk?refresh
|
||
{"index": {}}
|
||
{"my_location": {"lat":37.3450570, "lon": -122.0499820}, "@timestamp": "2013-09-06T16:00:36"}
|
||
{"index": {}}
|
||
{"my_location": {"lat": 37.3451320, "lon": -122.0499820}, "@timestamp": "2013-09-06T16:00:37Z"}
|
||
{"index": {}}
|
||
{"my_location": {"lat": 37.349283, "lon": -122.0505010}, "@timestamp": "2013-09-06T16:00:37Z"}
|
||
POST /test/_search?filter_path=aggregations
|
||
{
|
||
"aggs": {
|
||
"line": {
|
||
"geo_line": {
|
||
"point": {"field": "my_location"},
|
||
"sort": {"field": "@timestamp"}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>将存储桶中的所有geo_point值聚合到由所选排序字段排序的LineString中。</p>
|
||
<pre><code class="language-json">{
|
||
"aggregations": {
|
||
"line": {
|
||
"type" : "Feature",
|
||
"geometry" : {
|
||
"type" : "LineString",
|
||
"coordinates" : [
|
||
[
|
||
-122.049982,
|
||
37.345057
|
||
],
|
||
[
|
||
-122.050501,
|
||
37.349283
|
||
],
|
||
[
|
||
-122.049982,
|
||
37.345132
|
||
]
|
||
]
|
||
},
|
||
"properties" : {
|
||
"complete" : true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2>非单值分析:Top型</h2>
|
||
<h3><code>top_hits</code> 分桶后的top hits</h3>
|
||
<pre><code class="language-bash">POST /sales/_search?size=0
|
||
{
|
||
"aggs": {
|
||
"top_tags": {
|
||
"terms": {
|
||
"field": "type",
|
||
"size": 3
|
||
},
|
||
"aggs": {
|
||
"top_sales_hits": {
|
||
"top_hits": {
|
||
"sort": [
|
||
{
|
||
"date": {
|
||
"order": "desc"
|
||
}
|
||
}
|
||
],
|
||
"_source": {
|
||
"includes": [ "date", "price" ]
|
||
},
|
||
"size": 1
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-json">{
|
||
...
|
||
"aggregations": {
|
||
"top_tags": {
|
||
"doc_count_error_upper_bound": 0,
|
||
"sum_other_doc_count": 0,
|
||
"buckets": [
|
||
{
|
||
"key": "hat",
|
||
"doc_count": 3,
|
||
"top_sales_hits": {
|
||
"hits": {
|
||
"total" : {
|
||
"value": 3,
|
||
"relation": "eq"
|
||
},
|
||
"max_score": null,
|
||
"hits": [
|
||
{
|
||
"_index": "sales",
|
||
"_type": "_doc",
|
||
"_id": "AVnNBmauCQpcRyxw6ChK",
|
||
"_source": {
|
||
"date": "2015/03/01 00:00:00",
|
||
"price": 200
|
||
},
|
||
"sort": [
|
||
1425168000000
|
||
],
|
||
"_score": null
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"key": "t-shirt",
|
||
"doc_count": 3,
|
||
"top_sales_hits": {
|
||
"hits": {
|
||
"total" : {
|
||
"value": 3,
|
||
"relation": "eq"
|
||
},
|
||
"max_score": null,
|
||
"hits": [
|
||
{
|
||
"_index": "sales",
|
||
"_type": "_doc",
|
||
"_id": "AVnNBmauCQpcRyxw6ChL",
|
||
"_source": {
|
||
"date": "2015/03/01 00:00:00",
|
||
"price": 175
|
||
},
|
||
"sort": [
|
||
1425168000000
|
||
],
|
||
"_score": null
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"key": "bag",
|
||
"doc_count": 1,
|
||
"top_sales_hits": {
|
||
"hits": {
|
||
"total" : {
|
||
"value": 1,
|
||
"relation": "eq"
|
||
},
|
||
"max_score": null,
|
||
"hits": [
|
||
{
|
||
"_index": "sales",
|
||
"_type": "_doc",
|
||
"_id": "AVnNBmatCQpcRyxw6ChH",
|
||
"_source": {
|
||
"date": "2015/01/01 00:00:00",
|
||
"price": 150
|
||
},
|
||
"sort": [
|
||
1420070400000
|
||
],
|
||
"_score": null
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3><code>top_metrics</code></h3>
|
||
<pre><code class="language-bash">POST /test/_bulk?refresh
|
||
{"index": {}}
|
||
{"s": 1, "m": 3.1415}
|
||
{"index": {}}
|
||
{"s": 2, "m": 1.0}
|
||
{"index": {}}
|
||
{"s": 3, "m": 2.71828}
|
||
POST /test/_search?filter_path=aggregations
|
||
{
|
||
"aggs": {
|
||
"tm": {
|
||
"top_metrics": {
|
||
"metrics": {"field": "m"},
|
||
"sort": {"s": "desc"}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>返回</p>
|
||
<pre><code class="language-json">{
|
||
"aggregations": {
|
||
"tm": {
|
||
"top": [ {"sort": [3], "metrics": {"m": 2.718280076980591 } } ]
|
||
}
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2>参考文章</h2>
|
||
<p>https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics.html</p>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="float: left">
|
||
<a href="/专栏/ElasticSearch知识体系详解/10 聚合:聚合查询之Bucket聚合详解.md.html">上一页</a>
|
||
</div>
|
||
<div style="float: right">
|
||
<a href="/专栏/ElasticSearch知识体系详解/12 聚合:聚合查询之Pipline聚合详解.md.html">下一页</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
</div>
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70996fa3692e3d60","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
</body>
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag() {
|
||
dataLayer.push(arguments);
|
||
}
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-NPSEEVD756');
|
||
var path = window.location.pathname
|
||
var cookie = getCookie("lastPath");
|
||
console.log(path)
|
||
if (path.replace("/", "") === "") {
|
||
if (cookie.replace("/", "") !== "") {
|
||
console.log(cookie)
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
}
|
||
} else {
|
||
setCookie("lastPath", path)
|
||
}
|
||
function setCookie(cname, cvalue) {
|
||
var d = new Date();
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
var expires = "expires=" + d.toGMTString();
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
}
|
||
function getCookie(cname) {
|
||
var name = cname + "=";
|
||
var ca = document.cookie.split(';');
|
||
for (var i = 0; i < ca.length; i++) {
|
||
var c = ca[i].trim();
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
}
|
||
return "";
|
||
}
|
||
</script>
|
||
</html>
|