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(); }
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); }