### Description

Elasticsearch defines the concept of a [feature](https://www.elastic.co/guide/en/elasticsearch/reference/current/get-features-api.html) for the purpose of better managing them when snapshotting/restoring them via the [feature_states field](https://www.elastic.co/guide/en/elasticsearch/reference/current/create-snapshot-api.html#create-snapshot-api-feature-states)

The `shards_availability` health indicator currently diagnoses the condition of indices needing to be [restored from a snapshot](https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/cluster/routing/allocation/ShardsAvailabilityHealthIndicatorService.java#L138) and recommends a [troubleshooting guide](http://ela.st/restore-snapshot)

However, since `8.x` the restore API **must** use `feature_states` instead of specifying systems indices or system data streams as part of the `indices` field.

This proposes the `affected_resources` for the `restore_from_snapshot` diagnosis return the indices that are not part of a `feature` under the `INDICES` type, and a new type `FEATURES`.
e.g. instead of current behaviour
```
"affected_resources": {
  "indices": [
    ".geoip_databases",
    "test_index"
    ]
}
```
we could return:
```
"affected_resources": {
  "indices": [
    "test_index"
   ], 
  "features": [
     "geoip"
  ]
}
```



server/src/main/java/org/elasticsearch/cluster/routing/allocation/ShardsAvailabilityHealthIndicatorService.java
if (indicesWithUnavailableReplicasOnly.isEmpty() == false) {
                String impactDescription = String.format(
                    Locale.ROOT,
                    "Searches might be slower than usual. Fewer redundant copies of the data exist on %d %s [%s].",
                    indicesWithUnavailableReplicasOnly.size(),
                    indicesWithUnavailableReplicasOnly.size() == 1 ? "index" : "indices",
                    getTruncatedIndices(indicesWithUnavailableReplicasOnly, clusterMetadata)
                );
                impacts.add(
                    new HealthIndicatorImpact(NAME, REPLICA_UNASSIGNED_IMPACT_ID, 2, impactDescription, List.of(ImpactArea.SEARCH))
                );
            }
            return impacts;
        }
        /**
         * Returns the diagnosis for unassigned primary and replica shards.
         * @param verbose true if the diagnosis should be generated, false if they should be omitted.
         * @param maxAffectedResourcesCount the max number of affected resources to be returned as part of the diagnosis
         * @return The diagnoses list the indicator identified. Alternatively, an empty list if none were found or verbose is false.
         */
        public List<Diagnosis> getDiagnosis(boolean verbose, int maxAffectedResourcesCount) {
            if (verbose) {
                Map<Diagnosis.Definition, Set<String>> diagnosisToAffectedIndices = new HashMap<>(primaries.diagnosisDefinitions);
                replicas.diagnosisDefinitions.forEach((diagnosisDef, indicesWithReplicasUnassigned) -> {
                    Set<String> indicesWithPrimariesUnassigned = diagnosisToAffectedIndices.get(diagnosisDef);
                    if (indicesWithPrimariesUnassigned == null) {
                        diagnosisToAffectedIndices.put(diagnosisDef, indicesWithReplicasUnassigned);
                    } else {
                        indicesWithPrimariesUnassigned.addAll(indicesWithReplicasUnassigned);
                    }