ES聚合中的Filter Bucket(过滤桶)详解

这篇具有很好参考价值的文章主要介绍了ES聚合中的Filter Bucket(过滤桶)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

过滤桶 (Filter Bucket) 对聚合结果进行过滤

       平常的过滤我们可以查询然后包括一个过滤器 (filter) 返回一组文档的子集但是如果我们只想对聚合结果过滤怎么办? 假设我们正在为汽车经销商创建一个搜索页面, 我们希望显示出ford上个月售出的汽车的平均售价
这里我们无法简单的做范围限定,因为有两个不同的条件。搜索结果必须是 ford ,但是聚合结果必须是 ford 且 销售时间是在一个月前(sold > now - 1M) 。

       为了解决这个问题,我们可以用一种特殊的桶,叫做 filter (过滤桶) 。 我们可以指定一个过滤桶,当文档满足过滤桶的条件时,我们将其加入到桶内。

       查询语句如下: avg 度量会对 ford 和上个月售出的文档计算平均售价

GET /cars/transactions/_search
{
   "size" : 0,
   "query":{
      "match": {
         "make": "ford"
      }
   },
   "aggs":{
      "recent_sales": {
         "filter": { 
            "range": {
               "sold": {
                  "from": "now-1M"
               }
            }
         },
         "aggs": {
            "average_price":{
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}

具体分类如下:

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站点击跳转浏览。

单个过滤器(filter)聚合

       定义当前文档集上下文中匹配指定过滤器(filter)的所有文档的单个桶。 这通常用于将当前的聚合上下文缩小到一组特定的文档。

示例:

POST /sales/_search?size=0
{
    "aggs" : {
        "t_shirts" : {
            "filter" : { "term": { "type": "t-shirt" } },
            "aggs" : {
                "avg_price" : { "avg" : { "field" : "price" } }
            }
        }
    }
}

上面的例子计算了所有 t-shirt 类型产品的平均价格(price)。

响应:

{
    ...
    "aggregations" : {
        "t_shirts" : {
            "doc_count" : 3,
            "avg_price" : { "value" : 128.33333333333334 }
        }
    }
}

多个过滤器(filters)聚合 多桶聚合

定义一个多桶聚合,其中每个桶都与一个过滤器相关联。每个桶都会收集与其关联的过滤器匹配的所有文档。

示例:例如想知道包含错误和包含警告的各自的数量

PUT /logs/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "body" : "warning: page could not be rendered" }
{ "index" : { "_id" : 2 } }
{ "body" : "authentication error" }
{ "index" : { "_id" : 3 } }
{ "body" : "warning: connection timed out" }

GET logs/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "filters" : {
          "errors" :   { "match" : { "body" : "error"   }},
          "warnings" : { "match" : { "body" : "warning" }}
        }
      }
    }
  }
}

响应:

{
  "took": 9,
  "timed_out": false,
  "_shards": ...,
  "hits": ...,
  "aggregations": {
    "messages": {
      "buckets": {
        "errors": {
          "doc_count": 1
        },
        "warnings": {
          "doc_count": 2
        }
      }
    }
  }
}

匿名过滤器

filters 字段也可以指定为一个筛选器数组,比如下面这个请求:

GET logs/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "filters" : [
          { "match" : { "body" : "error"   }},
          { "match" : { "body" : "warning" }}
        ]
      }
    }
  }
}

过滤后的桶按照请求中给定的顺序返回。这个例子的响应是:

{
  "took": 4,
  "timed_out": false,
  "_shards": ...,
  "hits": ...,
  "aggregations": {
    "messages": {
      "buckets": [
        {
          "doc_count": 1
        },
        {
          "doc_count": 2
        }
      ]
    }
  }
}

其他桶(other_bucket)

过滤桶可以设置 other_bucket 参数,以便向响应中添加一个桶,该桶将包含不匹配任何给定的过滤器的所有文档。 该参数的值可以设置为:

  • false

    不会计算 other

  • true

    计算并返回 other 桶,当使用命名过滤器时返回一个命名(默认名称为 _other_)的桶,否则(使用匿名过滤器时)就是返回的桶中的最后一个

参数 other_bucket_key 可用于设置 other 桶的键,以取代默认的_other_。 设置此参数将隐式地将 other_bucket 参数设置为true

下面的代码片段显示了一个响应,其中 other 桶在请求中被命名为 other_messages

//向之前的索引中加一条数据
PUT logs/_doc/4?refresh
{
  "body": "info: user Bob logged out"
}
// 再次查询
GET logs/_search
{
  "size": 0,
  "aggs" : {
    "messages" : {
      "filters" : {
        "other_bucket_key": "other_messages",
        "filters" : {
          "errors" :   { "match" : { "body" : "error"   }},
          "warnings" : { "match" : { "body" : "warning" }}
        }
      }
    }
  }
}

响应应该是这样的:

{
  "took": 3,
  "timed_out": false,
  "_shards": ...,
  "hits": ...,
  "aggregations": {
    "messages": {
      "buckets": {
        "errors": {
          "doc_count": 1
        },
        "warnings": {
          "doc_count": 2
        },
        "other_messages": {
          "doc_count": 1
        }
      }
    }
  }
}

参考文档

https://www.elastic.co/guide/cn/elasticsearch/guide/current/aggregations.html文章来源地址https://www.toymoban.com/news/detail-663306.html

到了这里,关于ES聚合中的Filter Bucket(过滤桶)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES 聚合和过滤

    聚合范围限定还有一个自然的扩展就是过滤。因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上。 需求:找到售价在 $10,000 美元之上的所有汽车同时也为这些车计算平均售价 constant_score 忽略评分,提高查询效率,同时使用缓存缓存查询

    2024年02月15日
    浏览(28)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(68)
  • Rust中的迭代器的使用:map转换、filter过滤、fold聚合、chain链接

    Rust中的迭代器是一种强大的工具,它提供了一种灵活、通用的方法来遍历序列。迭代器是实现了Iterator trait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对象,并返回一个Option用于指示对象是否存在。 迭代器相比于for循环有一些优势。首先,迭代器提

    2023年04月12日
    浏览(35)
  • ES中使用 Top Hits 查询分桶聚合结果的每个桶的详细数据

    Top hits(顶部命中)是一个聚合功能,用于在查询结果中返回每个桶(bucket)中的顶部 N 个文档。这对于需要在聚合结果中查看每个桶中的最相关或最高评分文档的情况非常有用。 简单来说,Top Hits 就是对聚合结果中相关文档的详细展示,它不同于 Post Filter,Post Filter 是基于

    2024年02月07日
    浏览(35)
  • Elasticsearch专栏-6.es基本用法-聚合查询

    在es中,所有的聚合查询都是放在aggs中进行的。平均值、总和、最大、最小、数量对应的分别是:avg、sum、max、min、value_count 分组用到的是terms 上面语句中的size:3,指的是分组后,只展示前三个分组内容。size:0,指的是所有query查询结果,也就是原始数据,不需

    2024年02月09日
    浏览(35)
  • elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近

    2024年02月08日
    浏览(47)
  • 结果过滤器—MVC项目中结果过滤器(Result Filter)使用

    结果过滤器( ResultFilter ),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以 替换或更改 Action 结果 。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只

    2024年02月12日
    浏览(50)
  • es_聚合用法详解

    ES统计分析概念 ES中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景。 下面先介绍ES聚合查询的核心流程和核心概念。 ES聚合查询类似SQL的GROUP by,一般统计分析主要分为两个步骤: 分组 组内聚合 对查询的数据首先进行一轮分组,可以设置分组条件

    2024年02月01日
    浏览(30)
  • 关于Elasticsearch(es)中使用sql返回结果只有1000条

    es中返回的结果只有1000条,这是默认的,想要返回更多的结果,需要做两步: 1、设置max_result_window的大小 PUT indexName/_settings { “max_result_window”:20000 } max_result_window表示结果的最大数量 但是你这样设置完了之后,查询依旧还是1000条 2、查询的时候加上fetch_size 这表示页面上显

    2024年02月14日
    浏览(40)
  • Elasticsearch es查询结果只返回指定筛选字段_source

    参考:https://www.exception.site/elasticsearch/elasticsearch-query-custom-columns *** 只返回title、channel结果;下列两种语法方式都可以

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包