### Elasticsearch Version

main

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

all

### Problem Description

The `filter` agg should run as `filters` because the `filters` agg has tons of optimizations, some of them are even around when running with a single filter. At a minimum we should optimize the `filter` agg in the same way as `filters`, but I think it's easier if we just run it as `filters`.

### Steps to Reproduce

see above

### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/search/aggregations/CardinalityUpperBound.java
}
    /**
     * Get the rough measure of the number of buckets a fixed-bucket
     * {@link Aggregator} will collect.
     *
     * @param bucketCount the number of buckets that this {@link Aggregator}
     *   will collect per owning ordinal
     */
    public abstract CardinalityUpperBound multiply(int bucketCount);
    /**
     * Map the cardinality to a value. The argument to the {@code mapper}
     * is the estimated cardinality, or {@code Integer.MAX_VALUE} if the
     * cardinality is unknown.
     */
    public abstract <R> R map(IntFunction<R> mapper);
    /**
     * Cardinality estimate with a known upper bound.
     */
    private static class KnownCardinalityUpperBound extends CardinalityUpperBound {
        private final int estimate;
        KnownCardinalityUpperBound(int estimate) {
            this.estimate = estimate;
        }
        @Override
        public CardinalityUpperBound multiply(int bucketCount) {
            if (bucketCount < 0) {
                throw new IllegalArgumentException("bucketCount must be positive but was [" + bucketCount + "]");
            }
            switch (bucketCount) {