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/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java
if (visitDocs.compareAndSet(current, current + 1)) {
                                            break;
                                        }
                                    }
                                }
                            };
                        }
                        @Override
                        public ScoreMode scoreMode() {
                            return ScoreMode.COMPLETE;
                        }
                    };
                }
            }
            @Override
            public Void reduce(Collection<Collector> collectors) {
                return null;
            }
        };
        ContextIndexSearcher searcher = new ContextIndexSearcher(
            directoryReader,
            IndexSearcher.getDefaultSimilarity(),
            IndexSearcher.getDefaultQueryCache(),
            IndexSearcher.getDefaultQueryCachingPolicy(),
            randomBoolean(),
            executor
        ) {
            @Override
            protected LeafSlice[] slices(List<LeafReaderContext> leaves) {
                return slices(leaves, 1, 1);