2010-06-01 4 views
8

Ho trovato un ottimo esempio sull'acquisizione di conteggi di sfaccettatura su una query di base. Memorizza il bitarray della query di base per migliorare le prestazioni ogni volta che viene contato un facet.Lucene.NET 2.9 e 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); 

L'unico problema è che sto usando una versione più recente di Lucene.NET (2.9) e Filter.Bits è obsoleto. Ci viene detto di usare DocIdSet invece (piuttosto che BitArray).

Non riesco a scoprire come eseguire il bitArray.And (bitArray) con un docIdSet. Ho guardato in Reflector e ho trovato OpenIdSet che ha le operazioni di AND. Non sono sicuro che OpenIdSet sia la strada da percorrere, lo sto solo affermando.

Grazie in anticipo!

risposta

14

Trovato fuori.

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

risulta essere molto più veloce anche.

+1

grazie per aver condiviso la risposta, mi ha salvato molte ore di ricerca – Woland