2010-06-01 10 views
8

Encontré un excelente ejemplo de cómo agarrar los recuentos de facetas en una consulta base. Almacena el bitarray de la consulta base para mejorar el rendimiento cada vez que se cuenta una faceta.Lucene.NET 2.9 y BitArray/DocIdSet

 var genreQuery = new TermQuery(new Term("genre", genre)); 
     var genreQueryFilter = new QueryFilter(genreQuery); 
     BitArray genreBitArray = genreQueryFilter.Bits(searcher.GetIndexReader()); 
     Console.WriteLine("There are " + GetCardinality(genreBitArray) + " document with the genre " + genre); 

     // Next perform a regular search and get its BitArray result 
     Query searchQuery = MultiFieldQueryParser.Parse(term, new[] {"title", "description"}, new[] {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD}, new StandardAnalyzer()); 
     var searchQueryFilter = new QueryFilter(searchQuery); 
     BitArray searchBitArray = searchQueryFilter.Bits(searcher.GetIndexReader()); 
     Console.WriteLine("There are " + GetCardinality(searchBitArray) + " document containing the term " + term); 

El único problema es que estoy usando una versión más reciente de Lucene.NET (2.9) y Filter.Bits es obsoleto. Se nos dice que usemos DocIdSet en su lugar (en lugar de BitArray).

No puedo encontrar la forma de hacer bitArray.Y (bitArray) con un docIdSet. Miré en el reflector y encontré OpenIdSet, que tiene operaciones Y. No estoy seguro si OpenIdSet es la ruta a seguir, solo estoy diciendo.

¡Gracias de antemano!

Respuesta

14

Lo encontré.

  var productsDISI = new OpenBitSetDISI(productResults.Iterator(), 25000); 
      var termQuery = new TermQuery(new Term("Spec" + expectedFacet.SpecificationId, expectedFacet.SpecificationOptionId.ToString())); 
      var termQueryFilter = new QueryWrapperFilter(termQuery); 
      var termIterator = termQueryFilter.GetDocIdSet(productReader).Iterator(); 
      productsDISI.InPlaceAnd(termIterator); 
      var total = productsDISI.Cardinality(); 

resulta ser mucho más rápido también.

+1

gracias por compartir la respuesta, me ha ahorrado muchas horas de investigación – Woland