无法以聚合的形式删除结果桶 - Elasticsearch

时间:2016-07-25 15:48:36

标签: elasticsearch kibana

我在Elasticsearch中有以下结构的文档:

   "mappings": {
  "document": {
    "properties": {
      "@timestamp": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "@version": {
        "type": "string"
      },
      "id_secuencia": {
        "type": "long"
      },
      "event": {
        "properties": {
          "elapsedTime": {
            "type": "double"
          },
          "requestTime": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "error": {
            "properties": {
              "errorCode": {
                "type": "string",
                "index": "not_analyzed"
              },
              "failureDetail": {
                "type": "string"
              },
              "fault": {
                "type": "string"
              }
            }
          },
          "file": {
            "type": "string",
            "index": "not_analyzed"
          },
          "messageId": {
            "type": "string"
          },
          "request": {
            "properties": {
              "body": {
                "type": "string"
              },
              "header": {
                "type": "string"
              }
            }
          },
          "responseTime": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "service": {
            "properties": {
              "operation": {
                "type": "string",
                "index": "not_analyzed"
              },
              "project": {
                "type": "string",
                "index": "not_analyzed"
              },
              "proxy": {
                "type": "string",
                "index": "not_analyzed"
              },
              "version": {
                "type": "string",
                "index": "not_analyzed"
              }
            }
          },
          "timestamp": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "user": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      },
      "type": {
        "type": "string"
      }
    }
  }
}

我需要根据以下标准检索字段“ event.file ”(在Kibana数据表中显示)的唯一值列表:

  • “event.file”字段有多个文档具有相同的值

  • “event.file”值的所有出现都导致错误(所有文档中都存在字段“ event.error.errorCode ”)

为此目的,我一直在测试的方法是使用术语聚合,因此我可以获得包含单个文件名的所有文档的存储桶列表。我无法实现的是根据先前的标准在聚合中丢弃一些结果桶(如果其中至少有一个没有错误,则应该丢弃该桶)。

这是正确的方法还是有更好/更简单的方法来获得这种结果?

非常感谢。

1 个答案:

答案 0 :(得分:0)

在尝试了几个查询后,我发现以下方法(请参阅下面的查询)对我的目的有效。我现在看到的问题是显然在Kibana中不可能这样做,因为它不支持管道聚合(参见https://github.com/elastic/kibana/issues/4584)。

{
  "query": {
    "bool": {
      "must": [
        {
          "filtered": {
            "filter": {
              "exists": {
                "field": "event.file"
              }
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "file-events": {
      "terms": {
        "field": "event.file",
        "size": 0,
        "min_doc_count": 2
      },
      "aggs": {
        "files": {
          "filter": {
            "exists": {
              "field": "event.file"
            }
          },
          "aggs": {
            "totalFiles": {
              "value_count": {
                "field": "event.file"
              }
            }
          }
        },
        "errors": {
          "filter": {
            "exists": {
              "field": "event.error.errorCode"
            }
          },
          "aggs": {
            "totalErrors": {
              "value_count": {
                "field": "event.error.errorCode"
              }
            }
          }
        },
        "exhausted": {
          "bucket_selector": {
            "buckets_path": {
              "total_files":"files>totalFiles",
              "total_errors":"errors>totalErrors"
            },
            "script": "total_errors == total_files"
          }
        }
      }
    }
  }
}

同样,如果我错过了某些反馈,我们将不胜感激:)