Я нашел, что яркий пример при захвате фасета рассчитывает на основной запрос. Это хранит bitarray основного запроса для улучшения производительности каждый раз, фасет считается.
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) и Фильтр. Биты являются устаревшими. Нам говорят использовать DocIdSet вместо этого (а не BitArray).
Я не могу узнанный, как сделать bitArray. И (bitArray) с docIdSet. Я посмотрел в отражателе и нашел OpenIdSet, который имеет И операции. Не уверенный, если OpenIdSet является маршрутом для движения, просто заявляю я.
Заранее спасибо!
Обнаружил.
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();
тоже оказывается намного быстрее.