### 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
private static final Logger logger = LogManager.getLogger(TransportGetPipelineAction.class);
    private final Client client;
    @Inject
    public TransportGetPipelineAction(TransportService transportService, ActionFilters actionFilters, Client client) {
        super(GetPipelineAction.NAME, transportService, actionFilters, GetPipelineRequest::new);
        this.client = new OriginSettingClient(client, LOGSTASH_MANAGEMENT_ORIGIN);
    }
    @Override
    protected void doExecute(Task task, GetPipelineRequest request, ActionListener<GetPipelineResponse> listener) {
        if (request.ids().isEmpty()) {
            client.prepareSearch(Logstash.LOGSTASH_CONCRETE_INDEX_NAME)
                .setSource(
                    SearchSourceBuilder.searchSource()
                        .fetchSource(true)
                        .query(QueryBuilders.matchAllQuery())
                        .size(1000)
                        .trackTotalHits(true)
                )
                .setScroll(TimeValue.timeValueMinutes(1L))
                .execute(ActionListener.wrap(searchResponse -> {
                    final int numHits = Math.toIntExact(searchResponse.getHits().getTotalHits().value);
                    final Map<String, BytesReference> pipelineSources = Maps.newMapWithExpectedSize(numHits);
                    final Consumer<SearchResponse> clearScroll = (response) -> {
                        if (response != null && response.getScrollId() != null) {
                            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
                            clearScrollRequest.addScrollId(response.getScrollId());
                            client.clearScroll(
                                clearScrollRequest,
                                ActionListener.wrap(