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));
        }
Beispiel #2
0
            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);
            }
Beispiel #3
0
            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();
                }
            }
Beispiel #4
0
        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));
        }
Beispiel #5
0
            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();
                }
            }