In order to implement multi threaded search we need to adjust the logic that creates the slices.
The new slice logic should take the following into account:

- A minimum doc count per slice. In order to avoid a number of aggregations to produce in-accurate results, a slice should at least contain 10% of the total documents in the Lucene index.
- A maximum number of slices. The number of slices that a shard level search creates should be capped. To avoid creating more slices than available search threads.
server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java
}
            queueSizeBasedExecutor.invokeAll(listTasks);
            RuntimeException exception = null;
            final List<C> collectedCollectors = new ArrayList<>();
            for (Future<C> future : listTasks) {
                try {
                    collectedCollectors.add(future.get());
                    
                    
                } catch (InterruptedException e) {
                    if (exception == null) {
                        exception = new ThreadInterruptedException(e);
                    } else {
                        
                    }
                } catch (ExecutionException e) {
                    if (exception == null) {
                        if (e.getCause() instanceof RuntimeException runtimeException) {
                            exception = runtimeException;
                        } else {
                            exception = new RuntimeException(e.getCause());
                        }
                    } else {
                        
                    }
                }
            }
            if (exception != null) {
                throw exception;
            }