Beispiel #1
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);
            }