2010-06-01 9 views
8

मुझे मूल क्वेरी पर पहलू की गणना करने पर एक शानदार उदाहरण मिला। यह प्रत्येक पहलू की गिनती के दौरान प्रदर्शन को बेहतर बनाने के लिए आधार क्वेरी के बिटरैरे को संग्रहीत करता है।लुसीन.NET 2.9 और बिटएरे/डॉकआईडसेट

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

केवल समस्या यह है कि मैं Lucene.NET (2.9) के एक नए संस्करण का उपयोग कर रहा है और Filter.Bits अप्रचलित है। हमें इसके बजाय DocIdSet का उपयोग करने के लिए कहा जाता है (BitArray के बजाए)।

मुझे नहीं पता कि bitArray.And (bitArray) को docIdSet के साथ कैसे करना है। मैंने परावर्तक में देखा और ओपनआईडसेट पाया जिसमें ऑपरेशन है। सुनिश्चित नहीं है कि OpenIdSet जाने का मार्ग है, तो मैं बस बता रहा हूं।

अग्रिम धन्यवाद!

उत्तर

14

इसे मिला।

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

भी बहुत तेज़ हो जाता है।

+1

उत्तर साझा करने के लिए धन्यवाद, मुझे कई घंटे के शोध बचाए – Woland