8

基本クエリでファセット数を取得する素晴らしい例を見つけました。ファセットがカウントされるたびにパフォーマンスを向上させるために、基本クエリのビット配列を格納します。

        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 が廃止されていることです。代わりに (BitArray ではなく) DocIdSet を使用するように指示されています。

docIdSet を使用して bitArray.And(bitArray) を実行する方法がわかりません。リフレクターを調べたところ、 And 操作を持つ OpenIdSet が見つかりました。OpenIdSet が進むべきルートであるかどうかはわかりませんが、私はただ述べています。

前もって感謝します!

4

1 に答える 1

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

はるかに高速であることが判明しました。

于 2010-06-01T04:08:24.500 に答える