2011-08-03 3 views
1

ファセットが有効なLuceneの最新バージョンを使用しないと、マルチファセットヒットカウントを実装しようとしています。私は始めるには素晴らしい投稿を見つけましたが、多価値ファセットの次のステップについてはわかりません。以下の例は、単数の例のコードを示しています。カテゴリフィールド、および各フィールドのカウントを取得します。Lucene .NETマルチファセット

private static void FacetedSearch(string indexPath, string genre, string term) 
{ 
    // create searcher 
    var searcher = new IndexSearcher(indexPath); 

    // first get the BitArray result from the genre query 
    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); 

    // Now do the faceted search magic, combine the two bit arrays using a binary AND operation 
    BitArray combinedResults = searchBitArray.And(genreBitArray); 
    Console.WriteLine("There are " + GetCardinality(combinedResults) + 
       " document containing the term " + term + " and which are in the genre " + genre); 
} 

しかし、私は、例えば二つの別々のフィールドを、持っている場合カテゴリーやトピック、私が持っていることができるように:私のUIで

  • カテゴリ1 1、カテゴリ

  • Topic1、Topic2

を、これらの各チェックボックスであれば、私が選択することができますcategory1とcategory2の両方の場合、topic1、topic2の数はcategory1を選択した場合とは異なります。

その複数のインスタンスのビット配列の検索方法がわかりません。

答えて

0

ファセットカウントを計算するには、2回の検索のカーディナリティを取得する必要があります。上の例では、ジャンル=ジャンルのアイテムの最初の検索が行われ、タイトルと説明でキーワードのファセットが数えられます。

あなたが行っていることを達成するには、製品がカテゴリ1とカテゴリ2の両方にあるクエリであるベース検索を作成する必要があります。これを行うには、BooleanQueryを使用して初期結果セットを取得し、これは、あなたが(ループで)個別に各ファセットのクエリを作成し、あなたのカテゴリクエリと各ファセットのクエリの間、あなたのgetcardinality呼び出しを行うと、各ファセットのためにカウントする

var booleanQuery = new BooleanQuery(); 
booleanQuery.Add(new Term("category", "Category1")); 
booleanQuery.Add(new Term("category", "Category2")); 
var categoryFilter = new QueryFilter(booleanQuery); 
var catBits = categoryFilter.Bits(searcher.GetIndexReader()); 

ようなものになるだろう。

foreach (var topic in myTopics) { 
    var topicQueryFilter = new QueryFilter(new TermQuery(new Term("topic", topic))); 
    var topicBits = topicQueryFilter.Bits(searcher.GetIndexReader()); 

    var facetResults = catBits.And(topicBits); 
    var topicCount = GetCardinality(facetResults); 
} 
+0

どの名前空間が 'QueryFilter'ですか? –

4

ここLucene.netの上にファセット、閲覧エンジンをご覧ください:http://bobo.codeplex.com/ (それはhttp://javasoze.github.com/bobo/からポートです)

を、それはあなたのニーズを解決しない場合は、私に教えてください。

+0

残念ながら、私がアクセスできるLuceneのバージョンはCMSの一部であり、バージョンを更新することはできません。 boboと互換性のない2.3.1を使用しています。 – mickyjtwin

+0

私は参照してください。私はボボをLucene 2.3.1に移植することができると思いますが、それにはかなりの労力が必要です。ソースは入手可能なので、本当に必要な場合はソースを使用できます。しかし、私はあなたのケースでは簡単な解決策ではないことに同意します。 –