ES聚合过滤与排序

一. ES的过滤

    在实际的应用过程中,我们往往需要对数据过滤之后然后再进行聚合又或者说对过滤之后的数据做筛选。

1.1 局部过滤

     局部过滤意思就是只针对某个特定的聚合有用而对其他聚合没有作用。

查询所有的工种的分桶信息;查询年龄大于30岁的员工的分桶信息

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "all_jobs": {
      "terms": {
        "field": "job"
      }
    },
    "filter_jobs": {
      "filter": {
        "range": {
          "age": {
            "gte": 25
          }
        }
      },
      "aggs": {
        "older_emp_aggs": {
          "terms": {
            "field": "job"
          }
        }
      }
    }
  }
}
range的filter只针对和它同级的聚合操作有效

1.2 全局过滤

     全局过滤对所有的聚合查询都是有效的,但是也可以通过一定的方式来屏蔽全局过滤。

查询年龄在30岁以上的员工的桶信息;

GET employee/_search
{
  "size": 0, 
  "query": {
    "range": {
      "age": {
        "gte": 30
      }
    }
  },
  "aggs": {
    "job_agg": {
      "terms": {
        "field": "job"
      }
    },
    "ignore_global_filter": {
      "global": {},
      "aggs": {
        "sal_avg": {
          "avg": {
            "field": "sal"
          }
        }
      }
    }
  }
}
全局过滤器,也可以使用global将其忽略

二. 排序

    还可以对聚合的结果进行排序。

查询工种的桶信息,并根据各个工种的员工总数的倒序进行排序

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job",
        "order": {
          "_count": "desc"
        }
      }
    }
  }
}
根据员工总数进行倒序排序

根据各工种的平均工资的倒序排序

GET employee/_search
{
  "size": 0, 
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job",
        "order": [
          {
            "sal_avg": "desc"
          }  
        ]
      },
      "aggs": {
        "sal_avg": {
          "avg": {
            "field": "sal"
          }
        }
      }
    }
  }
}
根据聚合的结果排序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容