public void Execute() { //We only want to run the base query once, so we capture all of the facet-ing terms then run the query // once through the collector and pull out all of the terms in one shot var allCollector = new GatherAllCollector(); var facetsByName = new Dictionary <string, Dictionary <string, int> >(); IndexSearcher currentIndexSearcher; using (Database.IndexStorage.GetCurrentIndexSearcher(Index, out currentIndexSearcher)) { var baseQuery = Database.IndexStorage.GetLuceneQuery(Index, IndexQuery, Database.IndexQueryTriggers); currentIndexSearcher.Search(baseQuery, allCollector); var fields = Facets.Values.Select(x => x.Name) .Concat(Ranges.Select(x => x.Key)); var fieldsToRead = new HashSet <string>(fields); IndexedTerms.ReadEntriesForFields(currentIndexSearcher.IndexReader, fieldsToRead, allCollector.Documents, term => { List <ParsedRange> list; if (Ranges.TryGetValue(term.Field, out list)) { var num = NumericStringToNum(term.Text); for (int i = 0; i < list.Count; i++) { var parsedRange = list[i]; if (parsedRange.IsMatch(term.Text)) { Results.Results[term.Field].Values[i].Hits++; } } } Facet value; if (Facets.TryGetValue(term.Field, out value)) { var facetValues = facetsByName.GetOrAdd(term.Field); facetValues[term.Text] = facetValues.GetOrDefault(term.Text) + 1; } }); } UpdateFacetResults(facetsByName); }