Filters Aggregation

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html#_literal_other_literal_bucket

译文链接 :Filters Aggregation

贡献者 : @于永超,ApacheCNApache中文网

Filters Aggregation

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

例子:

  1. PUT /logs/message/_bulk?refresh
  2. { "index" : { "_id" : 1 } }
  3. { "body" : "warning: page could not be rendered" }
  4. { "index" : { "_id" : 2 } }
  5. { "body" : "authentication error" }
  6. { "index" : { "_id" : 3 } }
  7. { "body" : "warning: connection timed out" }
  8. GET logs/_search
  9. {
  10. "size": 0,
  11. "aggs" : {
  12. "messages" : {
  13. "filters" : {
  14. "filters" : {
  15. "errors" : { "match" : { "body" : "error" }},
  16. "warnings" : { "match" : { "body" : "warning" }}
  17. }
  18. }
  19. }
  20. }
  21. }

在上面的例子中,我们分析日志消息。 聚合将构建日志消息的两个集合(桶) - 一个用于所有包含 error 的消息,另一个用于包含 warning 的所有消息。

响应结果:

  1. {
  2. "took": 9,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "messages": {
  8. "buckets": {
  9. "errors": {
  10. "doc_count": 1
  11. },
  12. "warnings": {
  13. "doc_count": 2
  14. }
  15. }
  16. }
  17. }
  18. }

Anonymous filters(匿名过滤器)

过滤器字段也可以作为过滤器的数组提供,就像下面的请求一样

  1. GET logs/_search
  2. {
  3. "size": 0,
  4. "aggs" : {
  5. "messages" : {
  6. "filters" : {
  7. "filters" : [
  8. { "match" : { "body" : "error" }},
  9. { "match" : { "body" : "warning" }}
  10. ]
  11. }
  12. }
  13. }
  14. }

过滤的buckets(桶)按照请求中提供的顺序返回。 这个例子的响应结果是:

  1. {
  2. "took": 4,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "messages": {
  8. "buckets": [
  9. {
  10. "doc_count": 1
  11. },
  12. {
  13. "doc_count": 2
  14. }
  15. ]
  16. }
  17. }
  18. }

Other Bucket

other_bucket 参数可以为响应添加一个bucket,它将包含所有与给定过滤器不匹配的文档,该参数的值可以如下所示:

false

  1. 不计算 other bucket

true

  1. 如果使用了命名的过滤器,则返回另一个bucket bucket(默认命名为_other_),如果使用匿名过滤器,则返回最后一个bucket

otherbucket_key参数可用于将其他存储桶的密钥设置为除默认值_other之外的值。 设置此参数将会将other_bucket参数隐式设置为true。

下面的代码片段显示了请求另一个bucket被命名为other_messages的响应。

  1. PUT logs/message/4?refresh
  2. {
  3. "body": "info: user Bob logged out"
  4. }
  5. GET logs/_search
  6. {
  7. "size": 0,
  8. "aggs" : {
  9. "messages" : {
  10. "filters" : {
  11. "other_bucket_key": "other_messages",
  12. "filters" : {
  13. "errors" : { "match" : { "body" : "error" }},
  14. "warnings" : { "match" : { "body" : "warning" }}
  15. }
  16. }
  17. }
  18. }
  19. }

响应将如下所示:

  1. {
  2. "took": 3,
  3. "timed_out": false,
  4. "_shards": ...,
  5. "hits": ...,
  6. "aggregations": {
  7. "messages": {
  8. "buckets": {
  9. "errors": {
  10. "doc_count": 1
  11. },
  12. "warnings": {
  13. "doc_count": 2
  14. },
  15. "other_messages": {
  16. "doc_count": 1
  17. }
  18. }
  19. }
  20. }
  21. }