Many search requests have the following structure:

```
...
"query": {
      "bool": {
        "must": [],
        "filter": [
          {
            "match_phrase": {
              "data_stream.dataset": "kubernetes.container"
            }
          },
          {
            "range": {
              "@timestamp": {
                "format": "strict_date_optional_time",
                "gte": "...",
                "lte": "...."
              }
            }
          }
        ],
        "should": [],
        "must_not": []
      }
    }
...
```

The index pattern matches (`metrics-*`) matches all metric data streams, but the `match_phrase` query on the `data_stream.dataset` field, which is a constant keyword field, only matches with one specific data stream.

Before query rewriting either in the `can_match` or `query` phases, shards that are search-idle get refreshed. This increases the query time significantly. Many o11y use cases rely on the default refresh behaviour. Which is the schedule a refresh every second when a shard is search active and don't schedule any refreshes when a shard is search-idle, this to favour indexing performance.

The refresh that occurs before the query rewrite should not occur on shards that don't match with the required filter clause on the `data_stream.dataset` constant keyword field. That is the goal of this issue.. 
server/src/internalClusterTest/java/org/elasticsearch/index/shard/SearchIdleIT.java
client().admin()
            .indices()
            .prepareUpdateSettings("test")
            .setSettings(Settings.builder().put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), -1).build())
            .execute(ActionListener.running(updateSettingsLatch::countDown));
        assertHitCount(client().prepareSearch().get(), 2);
        
        updateSettingsLatch.await();
        refreshLatch.await();
        assertFalse(shard.hasRefreshPending());
        
        
        ensureNoPendingScheduledRefresh(indexService.getThreadPool());
        client().prepareIndex("test").setId("2").setSource("{\"foo\" : \"bar\"}", XContentType.JSON).get();
        assertTrue(shard.scheduledRefresh());
        assertFalse(shard.hasRefreshPending());
        assertTrue(shard.isSearchIdle());
        assertHitCount(client().prepareSearch().get(), 3);
        final IndicesStatsResponse statsResponse = client().admin().indices().stats(new IndicesStatsRequest()).actionGet();
        for (ShardStats shardStats : statsResponse.getShards()) {
            if (shardStats.isSearchIdle()) {
                assertTrue(shardStats.getSearchIdleTime() >= TimeValue.ZERO.millis());
            }
        }
    }
    private void ensureNoPendingScheduledRefresh(ThreadPool threadPool) {
        
        
        
        ThreadPoolExecutor refreshThreadPoolExecutor = (ThreadPoolExecutor) threadPool.executor(ThreadPool.Names.REFRESH);