private TopDocs ExecuteQuery(Query documentQuery, int start, int pageSize, Sort sort) { if (sort == null && _indexHasBoostedFields == false && IsBoostedQuery(documentQuery) == false) { if (pageSize == int.MaxValue || pageSize >= _searcher.MaxDoc) // we want all docs, no sorting required { var gatherAllCollector = new GatherAllCollector(Math.Min(pageSize, _searcher.MaxDoc)); _searcher.Search(documentQuery, gatherAllCollector, _state); return(gatherAllCollector.ToTopDocs()); } var noSortingCollector = new NonSortingCollector(Math.Abs(pageSize + start)); _searcher.Search(documentQuery, noSortingCollector, _state); return(noSortingCollector.ToTopDocs()); } var minPageSize = GetPageSize(_searcher, (long)pageSize + start); if (sort != null) { _searcher.SetDefaultFieldSortScoring(true, false); try { return(_searcher.Search(documentQuery, null, minPageSize, sort, _state)); } finally { _searcher.SetDefaultFieldSortScoring(false, false); } } return(_searcher.Search(documentQuery, null, minPageSize, _state)); }
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); }
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, FacetValue> >(); using (var currentState = Database.IndexStorage.GetCurrentStateHolder(Index)) { var currentIndexSearcher = currentState.IndexSearcher; 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); FieldTermVector fieldTermVector; var allVectoredTerms = fieldsToRead.All(s => indexDefinition.TermVectors.TryGetValue(s, out fieldTermVector) && fieldTermVector != FieldTermVector.No); if (allVectoredTerms) { IndexedTerms.ReadEntriesForFieldsFromTermVectors(currentState, fieldsToRead, allCollector.Documents, (field, value, doc) => HandleFacets(field, value, facetsByName, doc)); } else { IndexedTerms.ReadEntriesForFields(currentState, fieldsToRead, allCollector.Documents, (field, value, doc) => HandleFacets(field, value, facetsByName, doc)); } UpdateFacetResults(facetsByName); CompleteFacetCalculationsStage1(currentState, allVectoredTerms); CompleteFacetCalculationsStage2(); } }
private TopDocs ExecuteQuery(Query documentQuery, int start, int pageSize, Sort sort) { if (sort == null && _indexHasBoostedFields == false && IsBoostedQuery(documentQuery) == false) { if (pageSize == int.MaxValue) // we want all docs, no sorting required { var gatherAllCollector = new GatherAllCollector(); _searcher.Search(documentQuery, gatherAllCollector); return(gatherAllCollector.ToTopDocs()); } var noSortingCollector = new NonSortingCollector(Math.Abs(pageSize + start)); _searcher.Search(documentQuery, noSortingCollector); return(noSortingCollector.ToTopDocs()); } var absFullPage = Math.Abs(pageSize + start); // need to protect against ridiculously high values of pageSize + start that overflow var minPageSize = Math.Max(absFullPage, 1); if (sort != null) { _searcher.SetDefaultFieldSortScoring(true, false); try { return(_searcher.Search(documentQuery, null, minPageSize, sort)); } finally { _searcher.SetDefaultFieldSortScoring(false, false); } } return(_searcher.Search(documentQuery, null, minPageSize)); }
public void Execute() { ValidateFacets(); //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, FacetValue> >(); using (var currentState = Database.IndexStorage.GetCurrentStateHolder(Index)) { var currentIndexSearcher = currentState.IndexSearcher; var baseQuery = Database.IndexStorage.GetDocumentQuery(Index, IndexQuery, Database.IndexQueryTriggers); currentIndexSearcher.Search(baseQuery, allCollector); var indexReader = currentIndexSearcher.IndexReader; var fields = Facets.Values.Select(x => x.Name) .Concat(Ranges.Select(x => x.Key)); var fieldsToRead = new HashSet <string>(fields); IndexedTerms.ReadEntriesForFields(currentState, fieldsToRead, allCollector.Documents, (term, doc) => { var facets = Facets.Values.Where(facet => facet.Name == term.Field); foreach (var facet in facets) { switch (facet.Mode) { case FacetMode.Default: var facetValues = facetsByName.GetOrAdd(facet.DisplayName); FacetValue existing; if (facetValues.TryGetValue(term.Text, out existing) == false) { existing = new FacetValue { Range = GetRangeName(term) }; facetValues[term.Text] = existing; } ApplyFacetValueHit(existing, facet, doc, null, indexReader); break; case FacetMode.Ranges: List <ParsedRange> list; if (Ranges.TryGetValue(term.Field, out list)) { for (int i = 0; i < list.Count; i++) { var parsedRange = list[i]; if (parsedRange.IsMatch(term.Text)) { var facetValue = Results.Results[term.Field].Values[i]; ApplyFacetValueHit(facetValue, facet, doc, parsedRange, indexReader); } } } break; default: throw new ArgumentOutOfRangeException(); } } }); UpdateFacetResults(facetsByName); CompleteFacetCalculationsStage1(currentState); CompleteFacetCalculationsStage2(); } }