### Description

Logstash uses the endpoint  `_logstash/pipeline` to retrieve the pipelines configuration from Central Management.
Logstash permit to use the `*` wildcard operator to specify the pipeline names, so a user is not required to list all the pipelines, but just capture the common not changing part of the name. 
Suppose the user has a pipelines with common prefix (for example `pipeline_proxy_1`..`pipeline_proxy_10`), he could also add `pipeline_11` without restarting Logstash and changing the option `xpack.management.pipeline.id`.

Actually the feature is implemented on Logstash side, retrieving all the pipelines and then filtering out the ones that doesn't match; this is a waste. 
This feature request asks to implement the wildcard operator selector on Elasticsearch side.

The rules for wildcard in pipeline names are:
must begin with a letter or underscore and contain only letters, underscores, dashes, and numbers wildcard character `*` is also acceptable and follows globbing rules.

The regexp is defined [here](https://github.com/elastic/logstash/blob/0887d7609df9ba72a5d0cd003c639b16da198622/x-pack/lib/config_management/bootstrap_check.rb#L17-L19).

We could imagine to use the `_logstash/pipeline/<pipeline_id>` where the pipeline_id is a list of comma-separated id (like it's today) but permitting the pipeline_id to use the wildcard operator.

Related:
- Logstash ER https://github.com/elastic/logstash/issues/13868



x-pack/plugin/logstash/src/main/java/org/elasticsearch/xpack/logstash/action/TransportGetPipelineAction.java
(r) -> {},
                                    e -> logger.warn(() -> "clear scroll failed for scroll id [" + response.getScrollId() + "]", e)
                                )
                            );
                        }
                    };
                    handleSearchResponse(searchResponse, pipelineSources, clearScroll, listener);
                }, e -> handleFailure(e, listener)));
        } else if (request.ids().size() == 1) {
            client.prepareGet(Logstash.LOGSTASH_CONCRETE_INDEX_NAME, request.ids().get(0))
                .setFetchSource(true)
                .execute(ActionListener.wrap(response -> {
                    if (response.isExists()) {
                        listener.onResponse(new GetPipelineResponse(Map.of(response.getId(), response.getSourceAsBytesRef())));
                    } else {
                        listener.onResponse(new GetPipelineResponse(Map.of()));
                    }
                }, e -> handleFailure(e, listener)));
        } else {
            client.prepareMultiGet()
                .addIds(Logstash.LOGSTASH_CONCRETE_INDEX_NAME, request.ids())
                .execute(ActionListener.wrap(mGetResponse -> {
                    logFailures(mGetResponse);
                    listener.onResponse(
                        new GetPipelineResponse(
                            Arrays.stream(mGetResponse.getResponses())
                                .filter(itemResponse -> itemResponse.isFailed() == false)
                                .filter(itemResponse -> itemResponse.getResponse().isExists())
                                .map(MultiGetItemResponse::getResponse)
                                .collect(Collectors.toMap(GetResponse::getId, GetResponse::getSourceAsBytesRef))