Exemplo n.º 1
0
            private void CompleteFacetCalculationsStage1(IndexSearcherHolder.IndexSearcherHoldingState state, bool allVectoredTerms)
            {
                var fieldsToRead = new HashSet <string>(Facets
                                                        .Where(x => x.Value.Aggregation != FacetAggregation.None && x.Value.Aggregation != FacetAggregation.Count)
                                                        .Select(x => x.Value.AggregationField)
                                                        .Where(x => x != null));

                if (fieldsToRead.Count == 0)
                {
                    return;
                }

                var allDocs = new HashSet <int>(matches.Values.SelectMany(x => x.Docs));

                if (allVectoredTerms)
                {
                    IndexedTerms.ReadEntriesForFieldsFromTermVectors(state, fieldsToRead, allDocs, GetValueFromIndex,
                                                                     (field, textVal, currentVal, docId) =>
                                                                     HandleFacetsCalculationStage1(docId, field, textVal, currentVal));
                }
                else
                {
                    IndexedTerms.ReadEntriesForFields(state, fieldsToRead, allDocs, GetValueFromIndex,
                                                      (field, textVal, currentVal, docId) =>
                                                      HandleFacetsCalculationStage1(docId, field, textVal, currentVal));
                }
            }
Exemplo n.º 2
0
            private void CompleteFacetCalculationsStage1(IndexSearcherHolder.IndexSearcherHoldingState state)
            {
                var fieldsToRead = new HashSet <string>(Facets
                                                        .Where(x => x.Value.Aggregation != FacetAggregation.None && x.Value.Aggregation != FacetAggregation.Count)
                                                        .Select(x => x.Value.AggregationField)
                                                        .Where(x => x != null));

                if (fieldsToRead.Count == 0)
                {
                    return;
                }

                var allDocs = new HashSet <int>(matches.Values.SelectMany(x => x.Docs));

                IndexedTerms.ReadEntriesForFields(state, fieldsToRead, allDocs, GetValueFromIndex, (term, currentVal, docId) =>
                {
                    foreach (var match in matches)
                    {
                        if (match.Value.Docs.Contains(docId) == false)
                        {
                            continue;
                        }
                        var facet = match.Value.Facet;
                        if (term.Field != facet.AggregationField)
                        {
                            continue;
                        }
                        switch (facet.Mode)
                        {
                        case FacetMode.Default:
                            ApplyAggregation(facet, match.Key, currentVal);
                            break;

                        case FacetMode.Ranges:
                            if (!match.Value.Range.IsMatch(term.Text))
                            {
                                continue;
                            }
                            ApplyAggregation(facet, match.Key, currentVal);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                });
            }
Exemplo n.º 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, 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);
            }
Exemplo n.º 4
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();
                }
            }
Exemplo n.º 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();
                }
            }