Lucene.NET 2.9 и 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);

Единственная проблема заключается в том, что я использую более новую версию Lucene.NET (2.9), а Filter.Bits устарел. Вместо этого нам говорят использовать DocIdSet (а не BitArray).

Я не могу понять, как сделать bitArray.And(bitArray) с docIdSet. Я посмотрел в рефлекторе и нашел OpenIdSet, у которого есть операции And. Не уверен, что OpenIdSet - это правильный путь, я просто констатирую.

Заранее спасибо!


person Paul Knopf    schedule 01.06.2010    source источник


Ответы (1)


Обнаружил это.

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

тоже оказывается намного быстрее.

person Paul Knopf    schedule 01.06.2010
comment
спасибо, что поделились ответом, сэкономил мне много часов исследований - person Woland; 16.11.2013