2012-03-01 8 views
3

私はLucene.netを使用して、私がSimpleFacetedSearch機能を使用してファセット検索を行っているプロジェクトの1つで問題に遭遇しました。Lucene SimpleFacetedSearchファセット数が2048を超えました

は私が

スローされた例外を取得ファセットカウントが、私はできるだけ早く私は例外を取得別の面を追加するとファセッティングだ3列をしました

2048を超えました。

他のすべてのファセットを削除すると、新しいファセットが機能します。

私はそれは公共のだとしてしかし2048

foreach (string field in groupByFields) 
    { 
    ... 
    num *= fieldValuesBitSets1.FieldValueBitSetPair.Count; 
    if (num > SimpleFacetedSearch.MAX_FACETS) 
     throw new Exception("Facet count exceeded " + (object) SimpleFacetedSearch.MAX_FACETS); 
    fieldValuesBitSets.Add(fieldValuesBitSets1); 
    ... 
    } 

に一定のセットがあるMAX_FACETSを超えないファセットの数のチェックだSimpleFacetedSearchのコンストラクタの内部を見ることができますSimpleFacetedSearchのソースにドリルダウン私はそうそうすることができます。

SimpleFacetedSearch.MAX_FACETS = int.MaxValue; 

2048に設定されている理由を知っている人はいますか?私はそれに関する文書を見つけることができませんでした。

答えて

2

いいえ、変更する際に問題はありません。しかし、Bitsets(内部ではSimpleFacetedSearchのように)を使用すると、検索結果が大きいがファセットカウントが、ある程度はの数値を超えないと、パフォーマンスが向上することに注意してください。 (1000ファセットが1000万ヒットと言ってください)

ファセットがさらに多いが検索結果が大きくない場合は、コレクタ内の結果を反復処理してファセットを作成できます。この方法で、より良いパフォーマンスを得ることができます。 (100Kファセット1000ヒット)

したがって、2048は最適化された数値であるため、パフォーマンスが低下する可能性があります。

+0

を見てお気軽にあなたはコレクタにファセットを構築する方法上の任意の例を持っていますか? – Naz

+0

[SimpleFacetedSearch](https://cwiki.apache.org/LUCENEN/simple-faceted-search.html)のwikiページ:http://markmail.org/download.xqy?id=zrew4dimoktd6vex&number=1 –

+0

Iこれがwikiページの最新のリンクhttps://cwiki.apacheであると考えてください。org/confluence/display/LUCENENET /シンプル+ファセット+検索 – jes

1

回避するMAX_FACETSの問題は、メモリの使用とパフォーマンスの問題です。 内部的にSimpleFSはビットマップを使用して、各ファセット値がどのドキュメントで使用されているかを記録します。ドキュメントごとにビットがあり、各値には別々のビットマップがあります。したがって、多くの価値がある場合は、特に多くの文書がある場合は、必要なメモリ量が急速に増えます。メモリ=値*文書/ 8バイト。

私の会社には、数百万のドキュメントと数千の値の10のインデックスがあり、多くのGBのメモリが必要です。

私はSparseFacetedSearcherという別の実装を作成しました。これにより、各値のドキュメントIDが記録されます。だから、あなたはたった一つの文書あたりのビット数ではなくヒット数を支払うだけです。各文書に正確に1つの値(製品カテゴリのような)がある場合、32を超える値(製品カテゴリが32を超える)がある場合は、ブレークポイントが均等になります。 私たちの場合、メモリ使用量は数100MBにまで減少しました。

https://github.com/Artesian/SparseFacetedSearch

関連する問題