ElasticTalk

ElasticTalk

Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

Elasticsearchrockybean 发表了文章 • 1 个评论 • 122 次浏览 • 3 天前 • 来自相关话题

有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大家讲一条常见的 SQL 语句如何用 Elasticsearch 的查询语言实现。

1. SQL语句

假设我们有一个汽车的数据集,每个汽车都有车型、颜色等字段,我希望获取颜色种类大于1个的前2车型。假设汽车的数据模型如下:

{
    "model":"modelA",
    "color":"red"
}

假设我们有一个 cars 表,通过如下语句创建测试数据。

INSERT INTO cars (model,color) VALUES ('A','red'); 
INSERT INTO cars (model,color) VALUES ('A','white'); 
INSERT INTO cars (model,color) VALUES ('A','black'); 
INSERT INTO cars (model,color) VALUES ('A','yellow'); 
INSERT INTO cars (model,color) VALUES ('B','red'); 
INSERT INTO cars (model,color) VALUES ('B','white'); 
INSERT INTO cars (model,color) VALUES ('C','black'); 
INSERT INTO cars (model,color) VALUES ('C','red'); 
INSERT INTO cars (model,color) VALUES ('C','white'); 
INSERT INTO cars (model,color) VALUES ('C','yellow'); 
INSERT INTO cars (model,color) VALUES ('C','blue'); 
INSERT INTO cars (model,color) VALUES ('D','red');
INSERT INTO cars (model,color) VALUES ('A','red'); 

那么实现我们需求的 SQL 语句也比较简单,实现如下:

SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDER BY color_count desc LIMIT 2;

这条查询语句中 Group By 是按照 model 做分组, Having color_count>1 限定了车型颜色种类大于1,ORDER BY color_count desc 限定结果按照颜色种类倒序排列,而 LIMIT 2 限定只返回前3条数据。

那么在 Elasticsearch 中如何实现这个需求呢?

2. 在 Elasticsearch 模拟测试数据

首先我们需要先在 elasticsearch 中插入测试的数据,这里我们使用 bulk 接口 ,如下所示:

POST _bulk
{"index":{"_index":"cars","_type":"doc","_id":"1"}}
{"model":"A","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"2"}}
{"model":"A","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"3"}}
{"model":"A","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"4"}}
{"model":"A","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"5"}}
{"model":"B","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"6"}}
{"model":"B","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"7"}}
{"model":"C","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"8"}}
{"model":"C","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"9"}}
{"model":"C","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"10"}}
{"model":"C","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"11"}}
{"model":"C","color":"blue"}
{"index":{"_index":"cars","_type":"doc","_id":"12"}}
{"model":"D","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"13"}}
{"model":"A","color":"red"}

其中 index 为 cars,type 为 doc,所有数据与mysql 数据保持一致。大家可以在 Kibana 的 Dev Tools 中执行上面的命令,然后执行下面的查询语句验证数据是否已经成功存入。

GET cars/_search

3. Group By VS Terms/Metric Aggregation

SQL 中 Group By 语句在 Elasticsearch 中对应的是 Terms Aggregation,即分桶聚合,对应 Group By color 的语句如下所示:

GET cars/_search
{
  "size":0,
  "aggs":{
    "models":{
      "terms":{
        "field":"model.keyword"
      }
    }
  }
}

结果如下:

{
  "took": 161,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5
        },
        {
          "key": "C",
          "doc_count": 5
        },
        {
          "key": "B",
          "doc_count": 2
        },
        {
          "key": "D",
          "doc_count": 1
        }
      ]
    }
  }
}

我们看 aggregations 这个 key 下面的即为返回结果。

SQL 语句中还有一项是 COUNT(DISTINCT color) color_count 用于计算每个 model 的颜色数,在 Elasticsearch 中我们需要使用一个指标类聚合 Cardinality ,进行不同值计数。语句如下:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        }
      }
    }
  }
}

其返回结果如下:

{
  "took": 74,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        },
        {
          "key": "D",
          "doc_count": 1,
          "color_count": {
            "value": 1
          }
        }
      ]
    }
  }
}

结果中 color_count 即为每个 model 的颜色数,但这里所有的模型都返回了,我们只想要颜色数大于1的模型,因此这里还要加一个过滤条件。

4. Having Condition VS Bucket Filter Aggregation

Having color_count > 1 在 Elasticsearch 中对应的是 Bucket Filter 聚合,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 39,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        }
      ]
    }
  }
}

此时返回结果只包含颜色数大于1的模型,但大家会发现颜色数多的 C 不是在第一个位置,我们还需要做排序处理。

5. Order By Limit VS Bucket Sort Aggregation

ORDER BY color_count desc LIMIT 3 在 Elasticsearch 中可以使用 Bucket Sort 聚合实现,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        },
        "color_count_sort": {
          "bucket_sort": {
            "sort": {
              "color_count": "desc"
            },
            "size": 2
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 32,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        }
      ]
    }
  }
}

至此我们便将 SQL 语句实现的功能用 Elasticsearch 查询语句实现了。对比 SQL 语句与 Elasticsearch 的查询语句,大家会发现后者复杂了很多,但并非无章可循,随着大家对常见语法越来越熟悉,相信一定会越写越得心应手!

《Elastic Stack 从入门到实践》的课程已在慕课网上线,一次搞定 es logstash beats kibana

资料分享rockybean 发表了文章 • 2 个评论 • 555 次浏览 • 2018-04-03 22:58 • 来自相关话题

大家好,经过近半年的辛勤努力,我在慕课网推出了《Elastic Stack 从入门到实践》的课程(https://coding.imooc.com/class/chapter/181.html),其中包含了 elasticsearch 教程、beats 和 logstash 教程、kibana 教程,简单看下课程的内容:

第1章 课程概述 对课程整体进行介绍给出相关学习说明和建议 第2章 Elasticsearch 篇之 入门 本章会对 Elasticsearch 篇进行一个总体的介绍,让大家对该篇每一章要讲解的内容有初步的了解。然后会讲解 Elasticsearch 中常见的术语、api,然后运行 Elasticsearch 并实际感受 api 的调用方式,为接下来的课程做好准备。 第3章 Elasticsearch 篇之倒排索引与分词 本章会讲解搜索引擎的基础倒排索引,让大家对倒排索引有一个直观的认识,掌握它的组成。然后为大家讲解分词的相关知识,介绍 es 内置的分词器,还会介绍中文分词的常见解决方案。 第4章 Elasticsearch 篇之Mapping 设置 本章会讲解 Elasticsearch 中数据建模的基础--Mapping,即如何定义数据字段和类型。让大家熟悉 mapping 中常见的配置项,也会讲解 dynamic mapping 和 template 的相关知识。 第5章 Elasticsearch 篇之Search API 介绍 本章会讲解搜索特性,详细讲解 Search API 的组成和分类,带领大家逐个了解、掌握 API 的使用方法和技巧。 第6章 Elasticsearch 篇之分布式特性介绍 本章会讲解 Elasticsearch 集群是如何一步步搭建起来的,让大家了解不同节点类型的作用,shard 设计的意义以及文档是如何存储到 shard 上的,也会给大家介绍脑裂等问题。 第7章 Elasticsearch 篇之深入了解 Search 的运行机制 本章会深入讲解 Search 的运行机制,比如 Query 和 Fetch 阶段具体哪些工作,分片为相关性算分带来了哪些问题。另外还会讲解排序、分页与遍历的解决方案和相关问题。 第8章 Elasticsearch 篇之聚合分析入门 本章会介绍 Elasticsearch 聚合分析的功能,让大家了解其分类、组成,带领大家逐个了解、掌握每一个聚合 API 的使用方法和技巧,为后续 Kibana 使用打好基础。 第9章 Elasticsearch 篇之数据建模 本章会介绍使用 Elasticsearch 中要注意的数据建模常见问题以及优化思路和方案,让大家可以根据自己的业务场景设置最合理的模型。 第10章 Elasticsearch 篇之集群调优建议 本章会介绍 Elasticsearch 集群在搭建、配置上的注意事项,也会讲解读写性能优化的方案和调优的方式。 第11章 Logstash 篇之入门与运行机制 本章会介绍 Logstash 的作用、使用方法,让大家了解其组成和运行机制,带领大家实际操作 Logstash 来收集1个日志文件。 第12章 Logstash 篇之插件详解 本章会详细介绍 Input、Filter、Ouput 以及 Codec 插件 的作用和相关配置,让大家了解常见相关插件的使用场景和效果,以及如何合理选择各个插件来实现自己的业务需求。 第13章 Logstash 篇之实例分析 本章会以实例的形式为大家演示如何使用 Logstash 收集各种类型的数据,比如日志文件、数据库、tcp/udp 等。 第14章 Beats 篇之Filebeat 本章会介绍 Beats 的作用和组成,然后为大家详细介绍 Filebeat 的功能和常见配置,同时会详细讲解如何使用 Module 模块来快速完成日志的收集到分析工作。 第15章 Beats 篇之Metricbeat 本章会介绍 Metricbeat 的功能和使用技巧,让大家对 Metricbeat 的使用有一个直观的感受。 第16章 Beats 篇之Packetbeat 本章会介绍 Packetbeat 的功能和使用技巧,带领大家用 Packetbeat 来收集网络数据并进行分析,让大家对 Packetbeat 有一个直观的感受。 第17章 Beats 篇之其他 beat 本章会介绍其他众多beat的作用和应用场景,带领大家去发现社区提供的多种多样的beat,以满足日常业务开发的需求。 第18章 Kibana 篇之 入门与管理 本章会介绍 Kibana 的入门知识,让大家对 Kibana 有一个整体的了解,另外还会详细介绍Management 的功能,熟悉 Kibana 的配置。 第19章 Kibana 篇之 数据探索 Discovery 本章会介绍 Kibana 的数据探索功能,让大家了解 Discovery 的功能和使用技巧。 第20章 Kibana 篇之 可视化分析 本章会介绍Kibana 的可视化分析功能,首先会带领大家逐个操作 Kibana 提供的每一个图表,并会介绍时序分析工具 Timelion,然后会介绍如何使用 Dashboard功能来整合图表后讲故事或者做报表,也会讲解 Dashboard 使用中要注意的问题和使用技巧。 ... 第21章 实践篇 之搜索项目 本章会讲解一个搜索引擎相关的实践项目,带领大家通过编写少量的代码,快速基于 Elastic Stack 来构建一个具备常见搜索功能的系统,比如类似 Airbnb 的搜房系统、豆瓣电影等。 第22章 实践篇 之日志分析项目 本章会根据慕课网的日志为大家展示如何使用 Elastic Stack 来快速分析日志数据,带领大家一步步完成数据收集、处理、存储到可视化分析的步骤,最终打造属于自己的 Dashboard。 第23章 实践篇 之数据分析项目 本章会为大家展示如何使用 Elastic Stack 来分析身边的数据,比如空气质量分析、订单数据分析等等,让大家通过本章的学习可以快速将 Elastic Stack 应用到实际生活中。  

  实践方面我从搜索项目、日志分析和数据分析三个维度介绍了 Elastic Stack 的功能,可以看下最终的效果截图:  
MyAirbnb.png
 
[Project]_imooc_log_-Nginx_Overview.png
   
[Project]_北京的空气质量这些年有变好吗?.png
[Project]_2016年的北京雾霾.png
  那么剩下的就看你们了!                

ElasticTalk 第一期来袭!使用 ElasticStack 收集分析 Nginx 日志

活动rockybean 发表了文章 • 4 个评论 • 603 次浏览 • 2017-11-27 15:15 • 来自相关话题

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

Elasticsearchrockybean 发表了文章 • 1 个评论 • 122 次浏览 • 3 天前 • 来自相关话题

有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大家讲一条常见的 SQL 语句如何用 Elasticsearch 的查询语言实现。

1. SQL语句

假设我们有一个汽车的数据集,每个汽车都有车型、颜色等字段,我希望获取颜色种类大于1个的前2车型。假设汽车的数据模型如下:

{
    "model":"modelA",
    "color":"red"
}

假设我们有一个 cars 表,通过如下语句创建测试数据。

INSERT INTO cars (model,color) VALUES ('A','red'); 
INSERT INTO cars (model,color) VALUES ('A','white'); 
INSERT INTO cars (model,color) VALUES ('A','black'); 
INSERT INTO cars (model,color) VALUES ('A','yellow'); 
INSERT INTO cars (model,color) VALUES ('B','red'); 
INSERT INTO cars (model,color) VALUES ('B','white'); 
INSERT INTO cars (model,color) VALUES ('C','black'); 
INSERT INTO cars (model,color) VALUES ('C','red'); 
INSERT INTO cars (model,color) VALUES ('C','white'); 
INSERT INTO cars (model,color) VALUES ('C','yellow'); 
INSERT INTO cars (model,color) VALUES ('C','blue'); 
INSERT INTO cars (model,color) VALUES ('D','red');
INSERT INTO cars (model,color) VALUES ('A','red'); 

那么实现我们需求的 SQL 语句也比较简单,实现如下:

SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDER BY color_count desc LIMIT 2;

这条查询语句中 Group By 是按照 model 做分组, Having color_count>1 限定了车型颜色种类大于1,ORDER BY color_count desc 限定结果按照颜色种类倒序排列,而 LIMIT 2 限定只返回前3条数据。

那么在 Elasticsearch 中如何实现这个需求呢?

2. 在 Elasticsearch 模拟测试数据

首先我们需要先在 elasticsearch 中插入测试的数据,这里我们使用 bulk 接口 ,如下所示:

POST _bulk
{"index":{"_index":"cars","_type":"doc","_id":"1"}}
{"model":"A","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"2"}}
{"model":"A","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"3"}}
{"model":"A","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"4"}}
{"model":"A","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"5"}}
{"model":"B","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"6"}}
{"model":"B","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"7"}}
{"model":"C","color":"black"}
{"index":{"_index":"cars","_type":"doc","_id":"8"}}
{"model":"C","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"9"}}
{"model":"C","color":"white"}
{"index":{"_index":"cars","_type":"doc","_id":"10"}}
{"model":"C","color":"yellow"}
{"index":{"_index":"cars","_type":"doc","_id":"11"}}
{"model":"C","color":"blue"}
{"index":{"_index":"cars","_type":"doc","_id":"12"}}
{"model":"D","color":"red"}
{"index":{"_index":"cars","_type":"doc","_id":"13"}}
{"model":"A","color":"red"}

其中 index 为 cars,type 为 doc,所有数据与mysql 数据保持一致。大家可以在 Kibana 的 Dev Tools 中执行上面的命令,然后执行下面的查询语句验证数据是否已经成功存入。

GET cars/_search

3. Group By VS Terms/Metric Aggregation

SQL 中 Group By 语句在 Elasticsearch 中对应的是 Terms Aggregation,即分桶聚合,对应 Group By color 的语句如下所示:

GET cars/_search
{
  "size":0,
  "aggs":{
    "models":{
      "terms":{
        "field":"model.keyword"
      }
    }
  }
}

结果如下:

{
  "took": 161,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5
        },
        {
          "key": "C",
          "doc_count": 5
        },
        {
          "key": "B",
          "doc_count": 2
        },
        {
          "key": "D",
          "doc_count": 1
        }
      ]
    }
  }
}

我们看 aggregations 这个 key 下面的即为返回结果。

SQL 语句中还有一项是 COUNT(DISTINCT color) color_count 用于计算每个 model 的颜色数,在 Elasticsearch 中我们需要使用一个指标类聚合 Cardinality ,进行不同值计数。语句如下:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        }
      }
    }
  }
}

其返回结果如下:

{
  "took": 74,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        },
        {
          "key": "D",
          "doc_count": 1,
          "color_count": {
            "value": 1
          }
        }
      ]
    }
  }
}

结果中 color_count 即为每个 model 的颜色数,但这里所有的模型都返回了,我们只想要颜色数大于1的模型,因此这里还要加一个过滤条件。

4. Having Condition VS Bucket Filter Aggregation

Having color_count > 1 在 Elasticsearch 中对应的是 Bucket Filter 聚合,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 39,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        },
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "B",
          "doc_count": 2,
          "color_count": {
            "value": 2
          }
        }
      ]
    }
  }
}

此时返回结果只包含颜色数大于1的模型,但大家会发现颜色数多的 C 不是在第一个位置,我们还需要做排序处理。

5. Order By Limit VS Bucket Sort Aggregation

ORDER BY color_count desc LIMIT 3 在 Elasticsearch 中可以使用 Bucket Sort 聚合实现,语句如下所示:

GET cars/_search
{
  "size": 0,
  "aggs": {
    "models": {
      "terms": {
        "field": "model.keyword"
      },
      "aggs": {
        "color_count": {
          "cardinality": {
            "field": "color.keyword"
          }
        },
        "color_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "colorCount": "color_count"
            },
            "script": "params.colorCount>1"
          }
        },
        "color_count_sort": {
          "bucket_sort": {
            "sort": {
              "color_count": "desc"
            },
            "size": 2
          }
        }
      }
    }
  }
}

返回结果如下:

{
  "took": 32,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 13,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "models": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "C",
          "doc_count": 5,
          "color_count": {
            "value": 5
          }
        },
        {
          "key": "A",
          "doc_count": 5,
          "color_count": {
            "value": 4
          }
        }
      ]
    }
  }
}

至此我们便将 SQL 语句实现的功能用 Elasticsearch 查询语句实现了。对比 SQL 语句与 Elasticsearch 的查询语句,大家会发现后者复杂了很多,但并非无章可循,随着大家对常见语法越来越熟悉,相信一定会越写越得心应手!

《Elastic Stack 从入门到实践》的课程已在慕课网上线,一次搞定 es logstash beats kibana

资料分享rockybean 发表了文章 • 2 个评论 • 555 次浏览 • 2018-04-03 22:58 • 来自相关话题

大家好,经过近半年的辛勤努力,我在慕课网推出了《Elastic Stack 从入门到实践》的课程(https://coding.imooc.com/class/chapter/181.html),其中包含了 elasticsearch 教程、beats 和 logstash 教程、kibana 教程,简单看下课程的内容:

第1章 课程概述 对课程整体进行介绍给出相关学习说明和建议 第2章 Elasticsearch 篇之 入门 本章会对 Elasticsearch 篇进行一个总体的介绍,让大家对该篇每一章要讲解的内容有初步的了解。然后会讲解 Elasticsearch 中常见的术语、api,然后运行 Elasticsearch 并实际感受 api 的调用方式,为接下来的课程做好准备。 第3章 Elasticsearch 篇之倒排索引与分词 本章会讲解搜索引擎的基础倒排索引,让大家对倒排索引有一个直观的认识,掌握它的组成。然后为大家讲解分词的相关知识,介绍 es 内置的分词器,还会介绍中文分词的常见解决方案。 第4章 Elasticsearch 篇之Mapping 设置 本章会讲解 Elasticsearch 中数据建模的基础--Mapping,即如何定义数据字段和类型。让大家熟悉 mapping 中常见的配置项,也会讲解 dynamic mapping 和 template 的相关知识。 第5章 Elasticsearch 篇之Search API 介绍 本章会讲解搜索特性,详细讲解 Search API 的组成和分类,带领大家逐个了解、掌握 API 的使用方法和技巧。 第6章 Elasticsearch 篇之分布式特性介绍 本章会讲解 Elasticsearch 集群是如何一步步搭建起来的,让大家了解不同节点类型的作用,shard 设计的意义以及文档是如何存储到 shard 上的,也会给大家介绍脑裂等问题。 第7章 Elasticsearch 篇之深入了解 Search 的运行机制 本章会深入讲解 Search 的运行机制,比如 Query 和 Fetch 阶段具体哪些工作,分片为相关性算分带来了哪些问题。另外还会讲解排序、分页与遍历的解决方案和相关问题。 第8章 Elasticsearch 篇之聚合分析入门 本章会介绍 Elasticsearch 聚合分析的功能,让大家了解其分类、组成,带领大家逐个了解、掌握每一个聚合 API 的使用方法和技巧,为后续 Kibana 使用打好基础。 第9章 Elasticsearch 篇之数据建模 本章会介绍使用 Elasticsearch 中要注意的数据建模常见问题以及优化思路和方案,让大家可以根据自己的业务场景设置最合理的模型。 第10章 Elasticsearch 篇之集群调优建议 本章会介绍 Elasticsearch 集群在搭建、配置上的注意事项,也会讲解读写性能优化的方案和调优的方式。 第11章 Logstash 篇之入门与运行机制 本章会介绍 Logstash 的作用、使用方法,让大家了解其组成和运行机制,带领大家实际操作 Logstash 来收集1个日志文件。 第12章 Logstash 篇之插件详解 本章会详细介绍 Input、Filter、Ouput 以及 Codec 插件 的作用和相关配置,让大家了解常见相关插件的使用场景和效果,以及如何合理选择各个插件来实现自己的业务需求。 第13章 Logstash 篇之实例分析 本章会以实例的形式为大家演示如何使用 Logstash 收集各种类型的数据,比如日志文件、数据库、tcp/udp 等。 第14章 Beats 篇之Filebeat 本章会介绍 Beats 的作用和组成,然后为大家详细介绍 Filebeat 的功能和常见配置,同时会详细讲解如何使用 Module 模块来快速完成日志的收集到分析工作。 第15章 Beats 篇之Metricbeat 本章会介绍 Metricbeat 的功能和使用技巧,让大家对 Metricbeat 的使用有一个直观的感受。 第16章 Beats 篇之Packetbeat 本章会介绍 Packetbeat 的功能和使用技巧,带领大家用 Packetbeat 来收集网络数据并进行分析,让大家对 Packetbeat 有一个直观的感受。 第17章 Beats 篇之其他 beat 本章会介绍其他众多beat的作用和应用场景,带领大家去发现社区提供的多种多样的beat,以满足日常业务开发的需求。 第18章 Kibana 篇之 入门与管理 本章会介绍 Kibana 的入门知识,让大家对 Kibana 有一个整体的了解,另外还会详细介绍Management 的功能,熟悉 Kibana 的配置。 第19章 Kibana 篇之 数据探索 Discovery 本章会介绍 Kibana 的数据探索功能,让大家了解 Discovery 的功能和使用技巧。 第20章 Kibana 篇之 可视化分析 本章会介绍Kibana 的可视化分析功能,首先会带领大家逐个操作 Kibana 提供的每一个图表,并会介绍时序分析工具 Timelion,然后会介绍如何使用 Dashboard功能来整合图表后讲故事或者做报表,也会讲解 Dashboard 使用中要注意的问题和使用技巧。 ... 第21章 实践篇 之搜索项目 本章会讲解一个搜索引擎相关的实践项目,带领大家通过编写少量的代码,快速基于 Elastic Stack 来构建一个具备常见搜索功能的系统,比如类似 Airbnb 的搜房系统、豆瓣电影等。 第22章 实践篇 之日志分析项目 本章会根据慕课网的日志为大家展示如何使用 Elastic Stack 来快速分析日志数据,带领大家一步步完成数据收集、处理、存储到可视化分析的步骤,最终打造属于自己的 Dashboard。 第23章 实践篇 之数据分析项目 本章会为大家展示如何使用 Elastic Stack 来分析身边的数据,比如空气质量分析、订单数据分析等等,让大家通过本章的学习可以快速将 Elastic Stack 应用到实际生活中。  

  实践方面我从搜索项目、日志分析和数据分析三个维度介绍了 Elastic Stack 的功能,可以看下最终的效果截图:  
MyAirbnb.png
 
[Project]_imooc_log_-Nginx_Overview.png
   
[Project]_北京的空气质量这些年有变好吗?.png
[Project]_2016年的北京雾霾.png
  那么剩下的就看你们了!                

ElasticTalk 第一期来袭!使用 ElasticStack 收集分析 Nginx 日志

活动rockybean 发表了文章 • 4 个评论 • 603 次浏览 • 2017-11-27 15:15 • 来自相关话题

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg

今天正式启动 ElasticTalk 的活动,旨在通过线上直播的方式和大家交流 elastic 产品相关的知识。 第一期将于本周四(11月30日)晚8点在线直播,主题为使用 ElasticStack 收集和分析 Nginx 日志。感兴趣的同学可以加群讨论!

elastic_tips.001.jpeg