### 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
case 0:
                    return NONE;
                case 1:
                    return this;
                default:
                    long newEstimate = (long) estimate * (long) bucketCount;
                    if (newEstimate >= Integer.MAX_VALUE) {
                        return MANY;
                    }
                    return new KnownCardinalityUpperBound((int) newEstimate);
            }
        }
        @Override
        public <R> R map(IntFunction<R> mapper) {
            return mapper.apply(estimate);
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            KnownCardinalityUpperBound that = (KnownCardinalityUpperBound) o;
            return estimate == that.estimate;
        }
        @Override
        public int hashCode() {
            return Integer.hashCode(estimate);
        }
    }
}