Exemple #1
0
        public void SortOrder_With_MultiSearcher_Across_Indexes_Test()
        {
            var dir2 = new RAMDirectory();

            var indexWriter2 = new IndexWriter(dir2, _analyzer, IndexWriter.MaxFieldLength.UNLIMITED);

            indexWriter2.AddDocument(CreateDocument(100, "Anders", 0));

            indexWriter2.Commit();


            var searcher              = new IndexSearcher(_dir, true);
            var searcher2             = new IndexSearcher(dir2, true);
            var parallelMultiSearcher = new ParallelMultiSearcher(new Searchable[] { searcher, searcher2 });


            var sortOrder = new[] { 20, 10, 100, 30, 40 };
            var result    = Search(parallelMultiSearcher, _query, sortOrder);

            CollectionAssert.AreEqual(sortOrder, result);

            parallelMultiSearcher.Dispose();
            indexWriter2.Dispose();
            dir2.Dispose();
        }
        public void ParallelMultiSearcher_Sort_By_Custom_Int_Comparator_Test()
        {
            var parallelMultiSearcher = new ParallelMultiSearcher(
                new Searchable[] { _searcher1, _searcher2 });

            var result = Search(parallelMultiSearcher, _query, new Sort(new SortField(IdFieldName, new MyIntComparatorSource())));

            var expected = new[] { 10, 20, 30, 40, 50 };

            CollectionAssert.AreEqual(expected, result);

            parallelMultiSearcher.Dispose();
        }
        public void ParallelMultiSearcher_Sort_By_String_Test()
        {
            var parallelMultiSearcher = new ParallelMultiSearcher(
                new Searchable[] { _searcher1, _searcher2 });

            var result = Search(parallelMultiSearcher, _query, new Sort(new SortField(NameFieldName, SortField.STRING)));

            // Anders, Andreas, Anja, Anne
            var expected = new[] { 50, 10, 40, 20, 30 };

            CollectionAssert.AreEqual(expected, result);

            parallelMultiSearcher.Dispose();
        }
Exemple #4
0
        public IEnumerable <IHit> Query(int pageIndex, int pageSize, out int totalCount, out IEnumerable <FacetGroup> facetedResults)
        {
            totalCount     = 0;
            facetedResults = null;

            if (searchPaths == null || searchPaths.Count <= 0)
            {
                searchPaths.AddRange(indexPaths.Values.Select(o => o.Path));
            }

            List <LuceneHit> results = new List <LuceneHit>();

            List <IndexSearcher> subSearchs = new List <IndexSearcher>();

            searchPaths.ForEach(o => subSearchs.Add(new IndexSearcher(FSDirectory.Open(o))));

            if (facetFields != null && facetFields.Count > 0)
            {
                var         facetGroups     = new List <FacetGroup>();
                var         mainQueryFilter = new CachingWrapperFilter(new QueryWrapperFilter(query));
                MultiReader readers         = new MultiReader(subSearchs.Select(o => o.IndexReader).ToArray());

                foreach (var facetField in facetFields)
                {
                    FacetGroup fg = new FacetGroup();
                    fg.FieldName = facetFieldNameProvider.GetMapName(TypeName, facetField);
                    var items = new List <FacetItem>();

                    var allDistinctField = FieldCache_Fields.DEFAULT.GetStrings(readers, facetField).Distinct().ToArray();
                    int totalHits        = 0;

                    Parallel.ForEach(allDistinctField, fieldValue =>
                    {
                        //foreach (var fieldValue in allDistinctField)
                        //{
                        var facetQuery       = new TermQuery(new Term(facetField, fieldValue));
                        var facetQueryFilter = new CachingWrapperFilter(new QueryWrapperFilter(facetQuery));

                        var bs = new OpenBitSetDISI(facetQueryFilter.GetDocIdSet(readers).Iterator(), readers.MaxDoc);
                        bs.InPlaceAnd(mainQueryFilter.GetDocIdSet(readers).Iterator());
                        int count = (Int32)bs.Cardinality();

                        FacetItem item  = new FacetItem();
                        item.GroupValue = fieldValue;
                        item.Count      = count;

                        items.Add(item);
                        totalHits += count;
                    }
                                     );

                    fg.FacetItems = items.OrderByDescending(o => o.Count);
                    fg.TotalHits  = totalHits;

                    facetGroups.Add(fg);
                }

                facetedResults = facetGroups.OrderBy(o => o.FieldName);
            }
            ParallelMultiSearcher searcher = new ParallelMultiSearcher(subSearchs.ToArray());
            Sort sort = null;

            if (sortFields != null && sortFields.Count > 0)
            {
                sort = new Sort(sortFields.ToArray());
            }

            int maxDoc     = searcher.MaxDoc;
            int startIndex = 0;

            if (pageIndex >= 0 && pageSize > 0)
            {
                startIndex = pageIndex * pageSize;
                maxDoc     = pageSize * (pageIndex + 1);
            }
            var docs = sort == null?searcher.Search(query, null, maxDoc) : searcher.Search(query, null, maxDoc, sort);

            totalCount = docs.TotalHits;
            int endIndex = docs.TotalHits - startIndex;

            for (int i = startIndex; i < endIndex; i++)
            {
                LuceneHit h = new LuceneHit(TypeName, DocumentBuilder, searcher.Doc(docs.ScoreDocs[i].Doc));
                results.Add(h);
            }
            return(results);
        }