原文地址为: [Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations)

本章翻译自Elasticsearch官方指南的Filtering Queries and Aggregations一章。

过滤查询以及聚合

A natural extension to aggregation scoping is filtering. Because the aggregation operates in the context of the query scope, any filter applied to the query will also apply to the aggregation. 过滤是聚合作用域的一个很自然的扩展。因为聚合工作在查询作用域的上下文中,那么适用于查询的任何过滤器也同样能够适用于聚合。

filtered查询

如果你想要找到所有售价高于10000美刀的车,同时也对这些车计算其平均价格,那么可以使用一个filtered查询:

GET /cars/transactions/_search?search_type=count
{"query" : {"filtered": {"filter": {"range": {"price": {"gte": 10000}}}}},"aggs" : {"single_avg_price": {"avg" : { "field" : "price" }}}
}

从本质上而言,使用filtered查询和使用match查询并无区别,正如我们在上一章所讨论的那样。该查询(包含了一个过滤器)返回文档的一个特定子集,然后聚合工作在该子集上。

过滤桶(Filter Bucket)

如果你只想过滤聚合结果呢?假设我们正在创建针对汽车交易的搜索页面,我们想要根据用户搜索内容来展示对应结果。但是我们也想通过包含上个月出售的汽车的平均价格(匹配搜索的汽车)来让页面更加丰富。

此时我们不能使用简单的作用域,因为有两个不同搜索条件。搜索结果必须要匹配ford,但是聚合结果必须要匹配ford以及售出时间为上个月。

为了解决这一问题,我们使用一个名为filter的特殊桶。通过制定一个过滤器,当文档匹配了该过滤器的规则时,它就会被添加到桶中。

以下是得到的查询:

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

因为过滤器桶和任何其它桶以相似的方式工作,你可以任意地将其它桶和指标包含在其中。所有的嵌套组建都会"继承"该过滤器。从而使你能够根据需要对聚合中的内容进行过滤。

后置过滤器(Post Filter)

目前,我们有了用于过滤搜索结果和聚合的过滤器(filtered查询),也有了用于过滤聚合中某一部分的过滤器(filter桶)。

你也许会好奇,“是否有一种过滤器只过滤搜索结果,而不过滤聚合呢?”这个问题的答案就是使用post_filter。

它是搜索请求内能够接受一个过滤器作为参数的顶层元素。该过滤器会在查询执行完毕后生效(后置因此得名:在查询执行之后运行)。正因为它在查询执行后才会运行,所以它并不会影响查询作用域 - 因此就不会对聚合有所影响。

我们可以利用这一行为在搜索条件中添加额外的过滤器,而不影响用户界面中类似于类别分面(Categorical Facets)的元素。让我们设计另一个针对汽车交易的搜索页面。该页面允许用户对汽车进行搜索,同时还能够根据颜色进行过滤。颜色通过聚合提供:

GET /cars/transactions/_search?search_type=count
{"query": {"match": {"make": "ford"}},"post_filter": {    "term" : {"color" : "green"}},"aggs" : {"all_colors": {"terms" : { "field" : "color" }}}
}

post_filter元素是一个顶层元素,只会对搜索结果进行过滤。

查询部分呢用来找到所有ford汽车。然后我们根据一个terms聚合来得到颜色列表。因为聚合是在查询作用域中进行的,得到的颜色列表会反映出ford汽车的各种颜色。

最后,post_filter会对搜索结果进行过滤,只显示绿色的ford汽车。这一步发生在执行查询之后,因此聚合是不会被影响的。

这一点对于维持一致的用户界面而言是非常重要的。假设一个用户在界面上点击了一个分类(比如,绿色)。期望的结果是搜索结果被过滤了,而用户界面上的分类选项是不会变化的。如果你使用了一个filtered查询,用户界面上也立即会对分类进行更新,此时绿色就变成了唯一的选项 - 这显然不是用户想要的!

警告:性能考量

只有当你需要对搜索结果和聚合使用不同的过滤方式时才考虑使用post_filter。有时一些用户会直接在常规搜索中使用post_filter。

不要这样做!post_filter会在查询之后才会被执行,因此会失去过滤在性能上帮助(比如缓存)。

post_filter应该只和聚合一起使用,并且仅当你使用了不同的过滤条件时。

总结

选择合适类型的过滤 - 搜索结果(Search Hits),聚合(Aggregations),或两者 - 通常都取决于你的用户界面的行为。过滤器的选择(或者组合)取决于你想要如何向用户展示结果数据。

  • A filtered query affects both search results and aggregations.filtered查询会影响搜索结果和聚合。
  • filter桶只影响聚合。
  • post_filter只影响搜索结果。

转载请注明本文地址: [Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations)

[Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations)相关推荐

  1. elasticsearch 常见查询及聚合的JAVA API

    解决了困扰我的问题,特此分享一下 最近在研究ES 有点心得记录下备忘 ES 常见查询 根据ID 进行单个查询 GetResponse response = client.prepareGet(&quo ...

  2. Elasticsearch 搜索条件与聚合结果再进行过滤的多重聚合查询-过滤桶的使用(六)

    Elasticsearch 搜索条件与聚合结果再进行过滤的多重聚合查询-过滤桶的使用(六) 实现的需求:数据分析的大范围是福特的车子,而且还需要上个月这个牌子的汽车的平均售价 需求分析: Rest-A ...

  3. 【Spring Data ElasticSearch】高级查询,聚合

    [Spring Data ElasticSearch]高级查询,聚合 1. 高级查询 1.1 基本查询 1.2 自定义查询 1.3 分页查询 1.4 排序 2. 聚合 2.1 聚合为桶 2.2 嵌套聚 ...

  4. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  5. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 系统小说 www.kuwx.net 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch ...

  6. Elasticsearch 分页查询聚合分析

    分页查询 关于 Elasticsearch 分页查询,这几个问题经常被问到 问题1:想请问下,一次性获取索引上的某个字段的所有值(100 万左右),除了把 max_result_window 调大 , ...

  7. Elasticsearch查询和聚合基本语法

    1.概述 Elasticsearch主要的查询语法包括URI查询和body查询,URI比较轻便快速,而body查询作为一种json的格式化查询,可以有许多限制条件.本文主要介绍结构化查询的query, ...

  8. elasticsearch使用Filter过滤查询操作(使用marvel插件)

    1.filter查询语句 1)通过filter可以获取想要的数据 2)通过filter查询有缓存,大大提高查询效率,所以推荐使用filter查询 2.cache缓存 3.实例数据,准备数据: POST ...

  9. ElasticSearch 7.6 多子文档过滤查询

    一.es 7.x 父子文档的 field 及官方文档地址 我找了半天,原来官方本来就有教程,只不过专有名词没用对,所以在找官方文档的时候,一直徘徊不前,不说了,先去弄写代码了.后面有时间了在继续写. ...

最新文章

  1. python语言标号_Python 编码为什么那么蛋疼?
  2. 记一次Java进程突然消失问题
  3. python网络爬虫 - 如何伪装逃过反爬虫程序
  4. ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法
  5. Linux 命令之 xz -- POSIX 平台的具有高压缩率的压缩工具
  6. HTML meta元素
  7. oracle数据库如何写翻页_ORACLE翻页SQL语句
  8. 区别:synchronized与static synchronized
  9. UJAM Beatmaker VICE for Mac(80年代风格鼓机插件)
  10. pycharm访问服务器终端
  11. php异步通知并查询,服务器异步通知的接收by php
  12. android 设备实现定时重启(无root权限或已root)
  13. c语言中用于获取字符串长度的函数是,C语言字符串长度
  14. ubuntu 19查看和修改时区
  15. 苏宁易购,淘宝网,京东商城,百万级价格数据海量抓取
  16. pc计算机shift,电脑上的shift键怎么读?shift表示什么意思?
  17. 在CENTOS 7上安装SNIPE-IT进行资产管理
  18. jetson tk1开发(4)-tensorflow安装与配置
  19. 支付宝 微信 内购 支付
  20. Excel和Python实现梯度下降法

热门文章

  1. 【数据分析师】000-如何学习数据分析
  2. 仿微信通讯录滑动定位ListView功能
  3. nginx反向代理地址是域名时请求不通的情况
  4. 使用@JsonFormat的一个坑
  5. python + uiautomator2 中文使用细则
  6. 《R语言与统计分析》-探索性数据分析
  7. cobbler 无人值守安装
  8. APP自动化测试---adb常用命令+monkey自动化
  9. ssm整合笔记(1)-curd
  10. 基于买方意向的货物撮合交易