ES 聚合和过滤

2023-10-27

ES 聚合和过滤

  • 聚合范围限定还有一个自然的扩展就是过滤。因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上。

数据准备

  • PUT cars
    {
      "mappings": {
          "transactions": {
            "properties": {
              "color": {
                "type": "keyword"
              },
              "make": {
                "type": "keyword"
              },
              "price": {
                "type": "long"
              },
              "sold": {
                "type": "date"
              }
            }
          }
        }
    }
    
  • POST /cars/transactions/_bulk
    { "index": {}}
    { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
    { "index": {}}
    { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
    { "index": {}}
    { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
    { "index": {}}
    { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
    { "index": {}}
    { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
    { "index": {}}
    { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
    { "index": {}}
    { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
    { "index": {}}
    { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
    { "index": {}}
    { "price" : 8000, "color" : "blue", "make" : "bmw", "sold" : "2014-06-10" }
    { "index": {}}
    { "price" : 20000, "color" : "blue", "make" : "bmw", "sold" : "2014-10-10" }
    

过滤

  • 需求:找到售价在 $10,000 美元之上的所有汽车同时也为这些车计算平均售价

  • GET /cars/transactions/_search
    {
        "size" : 0,
        "query" : {
            "constant_score": {
                "filter": {
                    "range": {
                        "price": {
                            "gte": 10000
                        }
                    }
                }
            }
        },
        "aggs" : {
            "single_avg_price": {
                "avg" : { "field" : "price" }
            }
        }
    }
    
  • constant_score忽略评分,提高查询效率,同时使用缓存缓存查询结果

  • "hits": {
        "total": 9,
        "max_score": 1,
        "hits": [
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yy",
            "_score": 1,
            "_source": {
              "price": 15000,
              "color": "blue",
              "make": "toyota",
              "sold": "2014-07-02"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yv",
            "_score": 1,
            "_source": {
              "price": 10000,
              "color": "red",
              "make": "honda",
              "sold": "2014-10-28"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yw",
            "_score": 1,
            "_source": {
              "price": 20000,
              "color": "red",
              "make": "honda",
              "sold": "2014-11-05"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42y2",
            "_score": 1,
            "_source": {
              "price": 25000,
              "color": "blue",
              "make": "ford",
              "sold": "2014-02-12"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX--vgKqH29RD64k5sAk",
            "_score": 1,
            "_source": {
              "price": 20000,
              "color": "blue",
              "make": "bmw",
              "sold": "2014-10-10"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yz",
            "_score": 1,
            "_source": {
              "price": 12000,
              "color": "green",
              "make": "toyota",
              "sold": "2014-08-19"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42y0",
            "_score": 1,
            "_source": {
              "price": 20000,
              "color": "red",
              "make": "honda",
              "sold": "2014-11-05"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42y1",
            "_score": 1,
            "_source": {
              "price": 80000,
              "color": "red",
              "make": "bmw",
              "sold": "2014-01-01"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yx",
            "_score": 1,
            "_source": {
              "price": 30000,
              "color": "green",
              "make": "ford",
              "sold": "2014-05-18"
            }
          }
        ]
      },
      "aggregations": {
        "single_avg_price": {
          "value": 25777.777777777777
        }
      }
    
  • @Test
    public void test07(){
        AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("single_avg_price").field("price");
    
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery("price").gte(10000));
        ConstantScoreQueryBuilder constantScoreQueryBuilder = QueryBuilders.constantScoreQuery(boolQueryBuilder);
    
        SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch("cars")
                .setTypes("transactions")
                .setQuery(constantScoreQueryBuilder)
                .addAggregation(avgAggregationBuilder)
                .execute()
                .actionGet();
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit searchHit : hits){
            Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
            Integer price = (Integer) sourceAsMap.get("price");
            String color = (String) sourceAsMap.get("color");
            String make = (String) sourceAsMap.get("make");
            String sold = (String) sourceAsMap.get("sold");
            System.out.println(price+"-"+color+"-"+make+"-"+sold);
        }
        InternalAvg internalAvg = searchResponse.getAggregations().get("single_avg_price");
        System.out.println(internalAvg.getValue());
    }
    
  • 返回结果
    15000-blue-toyota-2014-07-02
    10000-red-honda-2014-10-28
    20000-red-honda-2014-11-05
    25000-blue-ford-2014-02-12
    20000-blue-bmw-2014-10-10
    12000-green-toyota-2014-08-19
    20000-red-honda-2014-11-05
    80000-red-bmw-2014-01-01
    30000-green-ford-2014-05-18
    25777.777777777777
    

过滤桶

  • 只对聚合结果进行过滤

  • 需求:找出经销商是ford并且出售时间大于2014-03-01的

  • GET /cars/transactions/_search
    {
       "query":{
          "match": {
             "make": "ford"
          }
       },
       "aggs":{
          "recent_sales": {
             "filter": { 
                "range": {
                   "sold": {
                      "gte": "2014-03-01"
                   }
                }
             },
             "aggs": {
                "average_price":{
                   "avg": {
                      "field": "price" 
                   }
                }
             }
          }
       }
    }
    
  •  返回结果
      "hits": {
        "total": 2,
        "max_score": 1.2039728,
        "hits": [
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42y2",
            "_score": 1.2039728,
            "_source": {
              "price": 25000,
              "color": "blue",
              "make": "ford",
              "sold": "2014-02-12"
            }
          },
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yx",
            "_score": 0.2876821,
            "_source": {
              "price": 30000,
              "color": "green",
              "make": "ford",
              "sold": "2014-05-18"
            }
          }
        ]
      },
      "aggregations": {
        "recent_sales": {
          "doc_count": 1,
          "average_price": {
            "value": 30000
          }
        }
      }
    
  • @Test
    public void test08(){
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("make", "ford");
    
        FilterAggregationBuilder filterAggregationBuilder = AggregationBuilders.filter("recent_sales", QueryBuilders.rangeQuery("sold").gte("2014-03-01"));
        AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("average_price").field("price");
        filterAggregationBuilder.subAggregation(avgAggregationBuilder);
    
        SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch("cars")
                .setTypes("transactions")
                .setQuery(matchQueryBuilder)
                .addAggregation(filterAggregationBuilder)
                .execute()
                .actionGet();
    
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit searchHit : hits){
            Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
            Integer price = (Integer) sourceAsMap.get("price");
            String color = (String) sourceAsMap.get("color");
            String make = (String) sourceAsMap.get("make");
            String sold = (String) sourceAsMap.get("sold");
            System.out.println(price+"-"+color+"-"+make+"-"+sold);
        }
        InternalFilter internalFilter = searchResponse.getAggregations().get("recent_sales");
        long docCount = internalFilter.getDocCount();
        System.out.println(docCount);
        InternalAvg internalAvg = internalFilter.getAggregations().get("average_price");
        System.out.println(internalAvg.getValue());
    }
    
  • 返回结果
    25000-blue-ford-2014-02-12
    30000-green-ford-2014-05-18
    1
    30000.0
    
  • 这样查询出来的结果是两个,而聚合的数据却只有一个,因为聚合的时候,出售时间为2011-02-12的数据被过滤掉了

  • filter 桶和其他桶的操作方式一样,所以可以随意将其他桶和度量嵌入其中。

后过滤

  • 只过滤搜索结果,不过滤聚合结果,使用post_filter

  • 需求:对ford所有颜色的数据进行聚合,但只查询颜色为绿色的数据

  • GET /cars/transactions/_search
    {
        "query": {
            "match": {
                "make": "ford"
            }
        },
        "post_filter": {    
            "term" : {
                "color" : "green"
            }
        },
        "aggs" : {
            "all_colors": {
                "terms" : { "field" : "color" }
            }
        }
    }
    
  • "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "cars",
            "_type": "transactions",
            "_id": "AX-0cAvB7h9TQ4Sk42yx",
            "_score": 0.2876821,
            "_source": {
              "price": 30000,
              "color": "green",
              "make": "ford",
              "sold": "2014-05-18"
            }
          }
        ]
      },
      "aggregations": {
        "all_colors": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "blue",
              "doc_count": 1
            },
            {
              "key": "green",
              "doc_count": 1
            }
          ]
        }
      }
    
  • @Test
    public void test09(){
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("make", "ford");
    
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("color", "green");
    
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("all_colors").field("color");
    
        SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch("cars")
                .setTypes("transactions")
                .setQuery(matchQueryBuilder)
                .setPostFilter(termQueryBuilder)
                .addAggregation(termsAggregationBuilder)
                .execute()
                .actionGet();
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit searchHit : hits){
            Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
            Integer price = (Integer) sourceAsMap.get("price");
            String color = (String) sourceAsMap.get("color");
            String make = (String) sourceAsMap.get("make");
            String sold = (String) sourceAsMap.get("sold");
            System.out.println(price+"-"+color+"-"+make+"-"+sold);
        }
        StringTerms stringTerms = searchResponse.getAggregations().get("all_colors");
        List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
        for (StringTerms.Bucket bucket : buckets){
            String keyAsString = bucket.getKeyAsString();
            long docCount = bucket.getDocCount();
            System.out.println(keyAsString+"-"+docCount);
        }
    }
    
  • 30000-green-ford-2014-05-18
    blue-1
    green-1
    
  • 这样查询出来的数据只有一条,而进行聚合的数据是两条。

  • 另外,post_filter的特性是在查询之后进行过滤,和聚合一起使用,使用的情况一般是需求对查询结果和聚合结果进行不同的过滤,不要只在查询的时候使用,影响性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES 聚合和过滤 的相关文章

随机推荐

  • 数据库JDBC --- Java Database Connectivity

    数据库JDBC Java Database Connectivity 关于JDBC 什么是JDBC JDBC的组成 JDBC API JDBC的数据类型 创建JDBC的步骤 常用属性 Result Set ResultSetMetaData
  • Oracle使用IN 不能超过1000问题

    1 美图 2 背景 是写代码的是遇到问题 ORA 01795 列表中的最大表达式数为 1000 虽然使用了 批量处理解决了问题 但是因为是使用了myIbatis spring boot oracle 我不太想 直接改代码 想通过修改myIb
  • 25行jQuery代码实现轮播图

    对于刚刚学习前端的同学来说 做一个轮播图是非常不容易的 今天我就将自己的心得跟和大家分享一下 实现轮播图有很多方法 今天我们就讲其中一种方法 让图片显示在一行内 然后让图片有规律的向左移动 大家可以先看看效果http www shareko
  • sqli-labs (less-24)

    sqli labs less 24 进入24关 输入用户名和密码 登入后会显示你的用户名 下面的输入框就是改密码 我在输入用户名和密码的位置试了很多次 发现用户名和密码的位置是没有注入点的 这里我们先点击右下角的 New User clic
  • Flutter-设置分割线Divider

    Divider height 1 0 indent 0 0 color MyColors color gray 150
  • PowerBI开发 第十八篇:行级安全(RLS)

    PowerBI可以通过RLS Row level security 限制用户对数据的访问 过滤器在行级别限制数据的访问 用户可以在角色中定义过滤器 通过角色来限制数据的访问 在PowerBI Service中 workspace中的memb
  • uniapp getUserProfile:fail invalid session

    uniapp uni getUserProflie 部分安卓手机调不起来弹窗 错误原因 应该在uni getUserProflie之前调用uni login 但是直接在uni login的成功回调里面调用uni getUserProflie
  • 九、Linux系统中的文件传输

    九 Linux系统中的文件传输 实验准备 两台可以通信的主机 systemctl disable firewalld systemctl stop firewalld 9 1 scp命令 上传 scp 本地文件 远程主机用户 远程主机ip
  • SDUT 2023 summer team contest(for 22) - 14

    A Amanda Lounges 题意 有n个机场 m条边 对于每个机场可能需要等候室也可能不需要 如果输入2 代表路线连接的两个机场都需要建立 输入1 代表路线连接的其中一个机场建立 必须 输入0代表路线连接的两个机场都不可以建立 问你最
  • 关于https页面使用ifream嵌套http页面问题解决

    之前公司项目 部署的时候协议用的http 然后前几天把协议换成了https的 当时也没仔细测试 觉得没什么问题 然后 昨天发现其中的某个播放视频的页面显示不出来了 报错信息 接着上这个页面的部分代码 就是这个页面用ifram嵌套了另一个项目
  • MyBatisPlus-黑马-笔记

    MyBatisPlus 目录 入门案例 标准数据层开发 标准CRUD使用 分页 DQL编程控制 条件查询 null判定 查询投影 查询条件 等值查询 范围查询 模糊查询 映射匹配兼容性 DML编程控制 id生成策略控制 多记录操作 逻辑删除
  • window.close()失效问题

    一般的窗口关闭的JS如下写法 window close 但是呢 chrome firefox等中有时候会不起作用 改为下面的写法 window open about blank self close 或者 window open self
  • lstmcell转onnx报错 自定义pytorch模型替换

    lstmcell在转onnx的时候会遇到不支持的情况 如果模型已经训练好 可以通过自己实现lstmcell的方式 加载训练好的权重 以下是实现代码 class MyLSTMCell nn Module def init self input
  • 希尔排序及代码实现

    前言 最近在学习排序 学习到希尔排序的时候对代码有一些感触 首先讲一下希尔排序是怎么个排序过程 然后在把我能够实现的从网上荡来的代码贴一下 然而这不是完了 我和组长大人在讨论一番后 发现这个荡来的代码是有些小问题的 所以把问题也写一下 排序
  • Spring-Security登录功能

    壹 Spring Security登录功能 一 简介 1 使用Spring Security实现登录 即安全管理 2 一个项目一般都会有登录功能 我们之前编写的登录功能非常简陋 不能用于实际开发 Spring Security提供了专业的实
  • ChatGPT笔记

    我最常用的GPT软件 1 移动端APP AI EDU 一直免费的一个应用 挺不错的AI EDUhttps ai aigcfun com 百度的文心一言 个人感觉一般般 可以下载app版本文心一言https yiyan baidu com N
  • 用Java实现一个五位的随机验证码

    public static void main String args 1 创建一个String变量来保存验证码的值 String data 2 创建一个Random对象 Random random new Random 3 循环五次 取得
  • 三种开源协议的选择:BSD,Apache,MIT

    前言 在github上使用开源项目的时候 最常见的有MIT Apache BSD三种许可协议 几种区别如下图 一般Apache都比较少遇到 最多的是BSD和MIT BSD和MIT的唯一区别 是否能用你的开源项目打广告 禁止 则选择BSD 允
  • ideavim几项配置,以便日后使用

    配置文件 ideavimrc UTF 8格式 纯文本文件 存放路径 C user 用户名 ideavimrc 替换查找 noremap action Find
  • ES 聚合和过滤

    ES 聚合和过滤 聚合范围限定还有一个自然的扩展就是过滤 因为聚合是在查询结果范围内操作的 任何可以适用于查询的过滤器也可以应用在聚合上 数据准备 PUT cars mappings transactions properties colo