`

Elasticsearch 聚合 - 时间数据处理(Looking at Time)

阅读更多

原文链接:http://blog.csdn.net/dm_vincent/article/details/42594043

 

本章翻译自Elasticsearch官方指南的Looking at Time一章。

 

 

时间数据处理(Looking at Time)

 

如果在ES中,搜索是最常见的行为,那么创建日期柱状图(Date Histogram)肯定是第二常见的。为什么要使用日期柱状图呢?

想象在你的数据中有一个时间戳。数据是什么不重要-Apache日志事件,股票交易日期,棒球比赛时间-任何拥有时间戳的数据都能通过日期柱状图受益。当你有时间戳时,你经常会想创建基于时间的指标信息:

  • 今年的每个月销售了多少辆车?

  • 过去的12小时中,这只股票的价格是多少?

  • 上周每个小时我们的网站的平均延迟是多少?

常规的histogram通常使用条形图来表示,而date histogram倾向于被装换为线图(Line Graph)来表达时间序列(Time Series)。很多公司使用ES就是为了对时间序列数据进行分析。

date_histogram的工作方式和常规的histogram类似。常规的histogram是基于数值字段来创建数值区间的桶,而date_histogram则是基于时间区间来创建桶。因此每个桶是按照某个特定的日历时间定义的(比如,1个月或者是2.5天)。

常规Histogram能够和日期一起使用吗?

从技术上而言,是可以的。常规的histogram桶可以和日期一起使用。但是,它并懂日期相关的信息(Not calendar-aware)。而对于date_histogram,你可以将间隔(Interval)指定为1个月,它知道2月份比12月份要短。date_histogram还能够和时区一同工作,因此你可以根据用户的时区来对图形进行定制,而不是根据服务器。

常规的histogram会将日期理解为数值,这意味着你必须将间隔以毫秒的形式指定。同时聚合也不理解日历间隔,所以它对于日期几乎是没法使用的。

第一个例子中,我们会创建一个简单的线图(Line Chart)来回答这个问题:每个月销售了多少辆车?

GET /cars/transactions/_search?search_type=count
{
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month", 
            "format": "yyyy-MM-dd" 
         }
      }
   }
}

在查询中有一个聚合,它为每个月创建了一个桶。它能够告诉我们每个月销售了多少辆车。同时指定了一个额外的格式参数让桶拥有更"美观"的键值。在内部,日期被简单地表示成数值。然而这会让UI设计师生气,因此使用格式参数可以让日期以更常见的格式进行表示。

得到的响应符合预期,但是也有一点意外(看看你能够察觉到):

{
   ...
   "aggregations": {
      "sales": {
         "buckets": [
            {
               "key_as_string": "2014-01-01",
               "key": 1388534400000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-02-01",
               "key": 1391212800000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-05-01",
               "key": 1398902400000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-07-01",
               "key": 1404172800000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-08-01",
               "key": 1406851200000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-10-01",
               "key": 1412121600000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-11-01",
               "key": 1414800000000,
               "doc_count": 2
            }
         ]
...
}

聚合完整地被表达出来了。你能看到其中有用来表示月份的桶,每个桶中的文档数量,以及漂亮的key_as_string。

 

 

返回空桶

 

发现在上面的响应中的奇怪之处了吗?

Yep, that’s right. We are missing a few months! By default, the date_histogram (and histogram too) returns only buckets that have a nonzero document count. 是的,我们缺失了几个月!默认情况下,date_histogram(以及histogram)只会返回文档数量大于0的桶。

这意味着得到的histogram响应是最小的。但是有些时候该行为并不是我们想要的。对于很多应用而言,你需要将得到的响应直接置入到一个图形库中,而不需要任何额外的处理。

因此本质上,我们需要返回所有的桶,哪怕其中不含有任何文档。我们可以设置两个额外的参数来实现这一行为:

GET /cars/transactions/_search?search_type=count
{
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month",
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         }
      }
   }
}

以上的min_doc_count参数会强制返回空桶,extended_bounds参数会强制返回一整年的数据。

这两个参数会强制返回该年中的所有月份,无论它们的文档数量是多少。min_doc_count的意思很容易懂:它强制返回哪怕为空的桶。

extended_bounds参数需要一些解释。min_doc_count会强制返回空桶,但是默认ES只会返回在你的数据中的最小值和最大值之间的桶。

因此如果你的数据分布在四月到七月,你得到的桶只会表示四月到七月中的几个月(可能为空,如果使用了min_doc_count=0)。为了得到一整年的桶,我们需要告诉ES需要得到的桶的范围。

extended_bounds参数就是用来告诉ES这一范围的。一旦你添加了这两个设置,得到的响应就很容易被图形生成库处理而最终得到下图:

 

 

另外的例子

 

我们已经看到过很多次,为了实现更复杂的行为,桶可以嵌套在桶中。为了说明这一点,我们会创建一个用来显示每个季度,所有制造商的总销售额的聚合。同时,我们也会在每个季度为每个制造商单独计算其总销售额,因此我们能够知道哪种汽车创造的收益最多:

GET /cars/transactions/_search?search_type=count
{
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "quarter", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0,
            "extended_bounds" : {
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         },
         "aggs": {
            "per_make_sum": {
               "terms": {
                  "field": "make"
               },
               "aggs": {
                  "sum_price": {
                     "sum": { "field": "price" } 
                  }
               }
            },
            "total_sum": {
               "sum": { "field": "price" } 
            }
         }
      }
   }
}

可以发现,interval参数被设成了quarter。

得到的响应如下(删除了很多):

{
....
"aggregations": {
   "sales": {
      "buckets": [
         {
            "key_as_string": "2014-01-01",
            "key": 1388534400000,
            "doc_count": 2,
            "total_sum": {
               "value": 105000
            },
            "per_make_sum": {
               "buckets": [
                  {
                     "key": "bmw",
                     "doc_count": 1,
                     "sum_price": {
                        "value": 80000
                     }
                  },
                  {
                     "key": "ford",
                     "doc_count": 1,
                     "sum_price": {
                        "value": 25000
                     }
                  }
               ]
            }
         },
...
}

我们可以将该响应放入到一个图形中,使用一个线图(Line Chart)来表达总销售额,一个条形图来显示每个制造商的销售额(每个季度),如下所示:

 

无限的可能性

 

显然它们都是简单的例子,但是在对聚合进行绘图时,是存在无限的可能性的。比如,下图是Kibana中的一个用来进行实时分析的仪表板,它使用了很多聚合:

因为聚合的实时性,类似这样的仪表板是很容易进行查询,操作和交互的。这让它们非常适合非技术人员和分析人员对数据进行分析,而不需要他们创建一个Hadoop任务。

为了创建类似Kibana的强大仪表板,你需要掌握一些高级概念,比如作用域(Scoping),过滤(Filtering)和聚合排序(Sorting Aggregations)。

 

分享到:
评论

相关推荐

    7.17.1系列Elasticsearch的elasticsearch-analysis-ik分词器

    适用于7.17.1系列,例如Elasticsearch的7.17.12版本。 elasticsearch-analysis-ik 是一个常用的...中文数字处理:elasticsearch-analysis-ik 还针对中文文本中的数字进行了特殊处理。它将连续的数字组合成一个整体。

    elasticsearch-analysis-ik-7.10.0.zip下载

    "elasticsearch-analysis-ik"是针对Elasticsearch的一个中文分词插件,它的主要功能是提供高效、精准的中文分词能力,使得Elasticsearch能够更好地理解和处理中文文本数据。 在Elasticsearch 7.10.0版本中,...

    elasticsearch-analysis-ik-7.16.3.zip

    在现代大数据分析和搜索引擎领域,Elasticsearch(ES)因其高效、灵活的全文检索能力而备受青睐。然而,对于中文这样的多字节语言,如何准确地进行分词是关键。这时,我们就需要引入专门的中文分词器。本文将详细...

    最新版 elasticsearch-analysis-ik-8.7.0.zip

    最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip

    elasticsearch-analysis-pinyin-7.4.0 es拼音分词器7.4.0

    Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于大数据领域的全文检索。它以其高可扩展性、实时性能以及丰富的分析能力著称。在中文环境下,由于汉字的复杂性,分词是实现有效搜索的关键步骤。为此,...

    elasticsearch-analysis-dynamic-synonym-7.2.0

    Elasticsearch(ES)是一款功能强大的全文搜索引擎,广泛应用于数据检索、数据分析等领域。为了提高搜索的准确性和便利性,Elasticsearch提供了丰富的分析插件,其中"elasticsearch-analysis-dynamic-synonym-7.2.0...

    elasticsearch-analysis-ik-7.10.2.zip

    总结,elasticsearch-analysis-ik-7.10.2是Elasticsearch在处理中文数据时的强大工具,它提供了灵活的分词策略,有效解决了中文文本处理的难题,提升了搜索和分析的准确性和效率。通过深入理解和配置这个插件,我们...

    elasticsearch-analysis-pinyin-7.10.1 elasticsearch-analysis-ik-7

    Elasticsearch是一个强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。在中文处理方面,它需要依赖特定的分词插件来对文本进行有效的索引和搜索。在给定的标题和描述中,提到了两个重要的插件:"elastic...

    elasticsearch-6.8.0+elasticsearch-analysis-ik-6.8.0 .zip

    通过将 Elasticsearch 与 Java 和 Spring Boot 集成,可以快速构建高性能的搜索引擎应用,满足实时数据处理和复杂查询的需求。同时,Elasticsearch 的灵活性和扩展性使其成为现代大数据环境下的理想选择。

    elasticsearch-analysis-dynamic-synonym-7.6.2

    总的来说,`elasticsearch-analysis-dynamic-synonym-7.6.2`插件是ES7.6.2版本中实现动态同义词功能的重要工具,它通过高效的数据处理和灵活的API,让同义词管理变得更加便捷,极大地提升了ES在实际业务中的应用效果...

    elasticsearch-hadoop-8.8.0

    Elasticsearch-Hadoop是Elasticsearch与Hadoop生态系统集成的重要组件,主要目的是让Hadoop能够无缝地访问和处理存储在Elasticsearch中的大数据。标题"elasticsearch-hadoop-8.8.0"指的是该组件的一个特定版本,即...

    elasticsearch-analysis-ik-8.2.0.zip

    Elasticsearch(ES)作为一款强大的开源搜索引擎,广泛应用于大数据处理和信息检索领域。在处理中文文本时,选择合适的分词器至关重要,elasticsearch-analysis-ik-8.2.0.zip 提供了针对 Elasticsearch 8.2.0 版本的...

    elasticsearch-analysis-ik-7.16.2.zip

    《Elasticsearch分词器:elasticsearch-analysis-ik-7.16.2深度解析》 在信息爆炸的时代,搜索引擎的效能成为了数据检索的关键。Elasticsearch作为一款强大的开源搜索引擎,其灵活性和可扩展性备受青睐。而在中文...

    elasticsearch-analysis-ik-7.4.2.zip.7z

    总的来说,elasticsearch-analysis-ik-7.4.2是Elasticsearch处理中文文本的重要工具,它使得Elasticsearch能更好地理解和处理中文数据,提升了中文搜索和分析的效率和准确性。无论是在网站搜索、信息检索还是数据...

    elasticsearch-jieba-plugin 8.8.2.zip

    总的来说,`elasticsearch-jieba-plugin`是Elasticsearch处理中文数据的得力助手,它让ES具备了强大的中文分词能力,极大地拓宽了其在中文环境下的应用场景。正确安装和配置后,你可以享受到更高效、更精准的中文...

    elasticsearch-HQ-master.zip

    Elasticsearch本身是一种开源的全文搜索引擎,广泛应用于大数据分析、日志聚合、实时搜索等领域。它的分布式特性使得它可以轻松扩展到数百甚至数千个节点,形成大规模的集群。然而,随着集群规模的扩大,管理和维护...

    elasticsearch-analysis-ik-7.3.2.zip

    Elasticsearch(ES)作为一个强大的全文搜索引擎,其在处理中文文档时,对中文分词的准确性和效率有着至关重要的作用。"elasticsearch-analysis-ik"是ES中最受欢迎的中文分词器之一,专为提升中文文本分析性能而设计...

    elasticsearch-analysis-ik-6.8.0.zip

    Elasticsearch 分析插件 IK 分词器是用于优化 Elasticsearch 搜索引擎中文处理的重要工具。在中文环境下,正确的分词对于提升搜索质量和精确性至关重要。IK 分词器因其高效的性能和丰富的自定义功能,在 Elastic...

    elasticsearch-analysis-ik-7.6.1.zip

    Elasticsearch(ES)是一个基于Lucene的分布式、RESTful搜索引擎,广泛应用于大数据分析、日志收集和全文检索等领域。它的核心功能包括索引、搜索、分析和聚合,但默认情况下对中文的支持并不完善,因此需要借助像IK...

    最新版 elasticsearch-analysis-ik-7.17.6.zip

    总结,elasticsearch-analysis-ik-7.17.6版本在提升性能和增强功能的同时,保持了易用性和可扩展性,是Elasticsearch处理中文数据的强大辅助。无论是对于新手还是经验丰富的开发者,都是一个值得信赖的选择。

Global site tag (gtag.js) - Google Analytics