elasticsearch查询模板

最近在公司又用到了elasticsearch,也用到了查询模板,顺便写篇文章记录一下查询模板的使用。

以1个需求为例讲解es模板的使用:

页面上某个按钮在一段时间内的点击次数统计,并且可以以小时,天,月为单位进行汇总,并且需要去重。

创建索引,只定义3个字段,user_id, user_name和create_time:

-POST /$ES/event_index

{
  "mappings": {
    "event": {
      "_ttl": {
        "enabled": false
      },
      "_timestamp": {
        "enabled": true,
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "properties": {
        "user_id": {
          "type": "string",
          "store": "no",
          "index": "not_analyzed"
        },
        "create_time": {
          "type": "date",
          "store": "no",
          "index": "not_analyzed",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "user_name": {
          "type": "string",
          "store": "no"
        }
      }
    }
  }
}

定义对应的查询模板,模板名字stats,使用了Cardinality和DateHistogram这两个Aggregation
,其中Date Histogram嵌套在Cardinality里。在定义模板的时候,{ { } } 的表示是个参数,需要调用模板的时候传递进来:

  -POST /$ES/_search/template/stats
{
    "template": {
        "query": {
            "bool": {
                "must": [
                    {
                        "range": {
                            "create_time": {
                                "gte": "{{earliest}}",
                                "lte": "{{latest}}"
                            }
                        }
                    }
                ]
            }
        },
        "size": 0,
        "aggs": {
            "stats_data": {
                "date_histogram": {
                    "field": "create_time",
                    "interval": "{{interval}}"
                },
                "aggs": {
                    "time": {
                        "cardinality": {
                            "field": "user_id"
                        }
                    }
                }
            }
        }
    }
}

Cardinality Aggregation的作用就是类似sql中的distinct,去重。

Date Histogram Aggregation的作用是根据时间进行统计。内部有个interval属性表面统计的范畴。

下面加几条数据到event_index里:

-POST $ES/event_index/event
{
    "user_id": "1",
    "user_name": "format1",
    "create_time": "2015-11-07 12:00:00"
}

-POST $ES/event_index/event
{
    "user_id": "2",
    "user_name": "format2",
    "create_time": "2015-11-07 13:30:00"
}

-POST $ES/event_index/event
{
    "user_id": "3",
    "user_name": "format3",
    "create_time": "2015-11-07 13:30:00"
}

-POST $ES/event_index/event
{
    "user_id": "1",
    "user_name": "format1",
    "create_time": "2015-11-07 13:50:00"
}

-POST $ES/event_index/event
{
    "user_id": "1",
    "user_name": "format1",
    "create_time": "2015-11-07 13:55:00"
}

11-07 12-13点有1条数据,1个用户
11-07 13-14点有4条数据,3个用户

使用模板查询:

curl -XGET "$ES/event_index/_search/template" -d‘{
  "template": { "id": "stats" },
  "params": { "earliest": "2015-11-07 00:00:00", "latest": "2015-11-07 23:59:59", "interval": "hour" }
}‘

结果:

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "stats_data": {
            "buckets": [
                {
                    "key_as_string": "2015-11-07 12:00:00",
                    "key": 1446897600000,
                    "doc_count": 1,
                    "time": {
                        "value": 1
                    }
                },
                {
                    "key_as_string": "2015-11-07 13:00:00",
                    "key": 1446901200000,
                    "doc_count": 4,
                    "time": {
                        "value": 3
                    }
                }
            ]
        }
    }
}

12点-13点的只有1条数据,1个用户。13-14点的有4条数据,3个用户。

以天(day)统计:

curl -XGET "$ES/event_index/_search/template" -d‘{
  "template": { "id": "stats" },
  "params": { "earliest": "2015-11-07 00:00:00", "latest": "2015-11-07 23:59:59", "interval": "day" }
}‘

结果:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "stats_data": {
            "buckets": [
                {
                    "key_as_string": "2015-11-07 00:00:00",
                    "key": 1446854400000,
                    "doc_count": 5,
                    "time": {
                        "value": 3
                    }
                }
            ]
        }
    }
}

11-07这一天有5条数据,3个用户。

本文只是简单说明了es查询模板的使用,也简单使用了2个aggregation。更多内容可以去官网查看相关资料。

时间: 2024-10-14 09:13:57

elasticsearch查询模板的相关文章

Elasticsearch教程 Elasticsearch查询语法 Elasticsearch权威指南 深入理解Elasticsearch

课程大纲 第1节结构化搜索_IT技术论坛案例背景介绍 9分钟 第2节结构化搜索_在案例中实战使用term filter来搜索数据 20分钟 第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)18分钟 第4节结构化搜索_在案例中实战基于bool组合多个filter条件来搜索数据 12分钟 第5节结构化搜索_在案例中实战使用terms搜索多个值以及多值搜索结果优化 7分钟 第6节结构化搜索_在案例中实战基于range filter来进行范围过滤 5分钟 第7节深度

Func<T,T>应用之Elasticsearch查询语句构造器的开发

前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryGroup = "{\"query\": {\"match\": { \"roomid\": \"FRIEND_12686_10035\" }}}"; //关键字查询 string queryKeyWord =

Elasticsearch入门教程(五):Elasticsearch查询(一)

原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79228852 // 准备数据 PUT /shop/goods/1 { "name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服", &quo

Elasticsearch入门教程(六):Elasticsearch查询(二)

原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79237950 地理坐标点geo-point 地理坐标点:是指地球表面可以用经纬度描述的一个点. 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中,或在聚合中. 地理坐标点不能被

ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探

一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建的索引上. 1)模板仅是一个索引被创建时才会起作用,修改模板并不会影响已创建的索引: 2)可以设定多个索引模板,这些设置会被merge在一起: 3)通过指定order的数值,控制merge的过程: 2.Index Template的工作方式如下: 当一个索引被创建时,会执行如下操作: 1)应用Ela

ElasticSearch查询 第四篇:匹配查询(Match)

匹配(Match)查询属于全文(Fulltext)查询,不同于词条查询,ElasticSearch引擎在处理全文搜索时,首先分析(analyze)查询字符串,然后根据分词构建查询,最终返回查询结果.匹配查询共有三种类型,分别是布尔(boolean).短语(phrase)和短语前缀(phrase_prefix),默认的匹配查询是布尔类型,这意味着,ElasticSearch引擎首先分析查询字符串,根据分析器对其进行分词,例如,对于以下match查询: "query":{ "ma

Elasticsearch 查询与过滤

今天在给上级汇报工作的时候,被问到了这个问题,一时也没回到上来. 英文原文: https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html 前面我们讲到的是关于结构化查询语句,事实上我们可以使用两种结构化语句: 结构化查询(Query DSL)和结构化过滤(Filter DSL). 查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异. 一条过滤语句会询问每个文档的字段值是否包含着

Elasticsearch查询类型

Elasticsearch支持两种类型的查询:基本查询和复合查询. 基本查询,如词条查询用于查询实际数据. 复合查询,如布尔查询,可以合并多个查询, 然而,这不是全部.除了这两种类型的查询,你还可以用过滤查询,根据一定的条件缩小查询结果.不像其他查询,筛选查询不会影响得分,而且通常非常高效. 更加复杂的情况,查询可以包含其他查询.此外,一些查询可以包含过滤器,而其他查询可同时包含查询和过滤器.这并不是全部,但暂时先解释这些工作. 1.简单查询 这种查询方式很简单,但比较局限. 查询last_na

(转)Elasticsearch查询规则------match和term

es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询全部员工 GET /megacorp/employee/_search?q=last_name:Smith //查询last_name为Smith的员工 另外一种是通过DSL语句来进行查询,被称为DSL查询(Query DSL),DSL是Elasticsearch提供的一种丰富且灵活的查询语言,该语