"internal" class to extract the DocIDs of each value of a field
Exemple #1
0
        public SparseFacetedSearcher(IndexReader reader, params string[] groupByFields)
        {
            this.reader = reader;

            var fieldValuesBitSets = new List <FieldValuesDocIDs>();

            //STEP 1
            //f1 = A, B
            //f2 = I, J
            //f3 = 1, 2, 3
            int maxFacets = 1;
            var inputToCP = new List <List <string> >();

            foreach (string field in groupByFields)
            {
                var f = new FieldValuesDocIDs(reader, field);
                maxFacets *= f.FieldValueDocIDsPair.Count;
                if (maxFacets > MAX_FACETS)
                {
                    throw new Exception("Facet count exceeded " + MAX_FACETS);
                }
                fieldValuesBitSets.Add(f);
                inputToCP.Add(f.FieldValueDocIDsPair.Keys.ToList());
            }

            //STEP 2
            // comb1: A I 1
            // comb2: A I 2 etc.
            var cp = inputToCP.CartesianProduct();

            //SETP 3
            //create a single BitSet for each combination
            //BitSet1: A AND I AND 1
            //BitSet2: A AND I AND 2 etc.
            //and remove impossible comb's (for ex, B J 3) from list.
            Parallel.ForEach(cp, combinations =>
            {
                var comb = combinations.ToList();

                var bitSet = fieldValuesBitSets[0].FieldValueDocIDsPair[comb[0]];
                for (int j = 1; j < comb.Count; j++)
                {
                    bitSet = bitSet.WalkingIntersect(fieldValuesBitSets[j].FieldValueDocIDsPair[comb[j]]).ToList();
                }

                //STEP 3
                if (bitSet.Any())
                {
                    lock (groups)
                        groups.Add(Tuple.Create(new FacetName(comb), bitSet));
                }
            });

            //Now groups has 7 rows (as <List<string>, BitSet> pairs)
        }
        public SparseFacetedSearcher(IndexReader reader, params string[] groupByFields)
        {
            this.reader = reader;

            var fieldValuesBitSets = new List<FieldValuesDocIDs>();

            //STEP 1
            //f1 = A, B
            //f2 = I, J
            //f3 = 1, 2, 3
            int maxFacets = 1;
            var inputToCP = new List<List<string>>();
            foreach (string field in groupByFields)
            {
                var f = new FieldValuesDocIDs(reader, field);
                maxFacets *= f.FieldValueDocIDsPair.Count;
                if (maxFacets > MAX_FACETS) throw new Exception("Facet count exceeded " + MAX_FACETS);
                fieldValuesBitSets.Add(f);
                inputToCP.Add(f.FieldValueDocIDsPair.Keys.ToList());
            }

            //STEP 2
            // comb1: A I 1
            // comb2: A I 2 etc.
            var cp = inputToCP.CartesianProduct();

            //SETP 3
            //create a single BitSet for each combination
            //BitSet1: A AND I AND 1
            //BitSet2: A AND I AND 2 etc.
            //and remove impossible comb's (for ex, B J 3) from list.
            Parallel.ForEach(cp, combinations =>
            {
                var comb = combinations.ToList();

                var bitSet = fieldValuesBitSets[0].FieldValueDocIDsPair[comb[0]];
                for (int j = 1; j < comb.Count; j++)
                    bitSet = bitSet.WalkingIntersect(fieldValuesBitSets[j].FieldValueDocIDsPair[comb[j]]).ToList();

                //STEP 3
                if (bitSet.Any())
                {
                    lock (groups)
                        groups.Add(Tuple.Create(new FacetName(comb), bitSet));
                }
            });

            //Now groups has 7 rows (as <List<string>, BitSet> pairs)
        }