2012-03-26 31 views
5

私たちは86,315,770個のドキュメントを持つsolrインスタンスを持っています。これは最大4GBのメモリを使用しており、コンテンツと呼ばれるトークン化されたフィールドでファセッティングする必要があります。ディスク上のインデックスサイズは23GBです。Solrファセット検索パフォーマンスの推奨事項

なぜトークン化されたフィールドでファセット処理をしていますか?私たちは、そのフィールドで最も使用されている上位n個の用語を検索したいからです。問題は、このようなクエリを実行するのに時間がかかりすぎているかどうかです。このようなファセッティングをするときに時間を改善する方法はありますか?どんな勧告?

ありがとうございます。

+0

あなたは 'facet.limit'を設定していますか?私は、 'facet.limit'が設定されていない場合(あなたの場合は' n 'でもよいでしょう)、このようなクエリが100,000以上のレコードであっても長い時間がかかることに気付きました。 –

答えて

2

Solrはメモリ内のデータ構造上のファセットを計算するため、ファセット計算はCPUバインドになる可能性があります。ファセットを計算するコードは、すでに高度に最適化されています(多値フィールドの場合UnInvertedFieldgetCountsメソッド)。

1つの考え方は、計算を並列化することです。おそらく、これを行う最も簡単な方法は、Do multiple Solr shards on a single machine improve performance?で説明されているように、あなたのコレクションをいくつかのシャードに分割することです。

用語辞書が十分に小さく、クエリで限られた数のフォームを使用できる場合は、すべての(用語、クエリ)ペアのカウントマトリックスを維持する別のシステムを設定できます。たとえば、用語クエリのみを許可する場合は、すべての用語ペアの数を維持する必要があります。これは、用語とクエリの総数に応じて多くのディスク領域を必要とすることに注意してください。カウントを正確にする必要がない場合は、バッチプロセスでこれらのカウントを計算するのが最も簡単な方法でしょう。それ以外の場合は、カウントをSolrと同期させるのはちょっと難しいかもしれません。

0

topTermsの機能はLukeRequestHandlerです。

+0

問題点用語集をクエリに適用する必要があります。 topTermsで可能ですか? – rreyes1979

+0

上記のコメントで説明したように、Lukeリクエストの 'numTerms'パラメータを任意の値に設定します。これは' facet.limit'と似ています。ただし、Lukeは索引の中で、検索可能ではなくなった(つまり、削除されていてもまだマージされていない)ドキュメントのトップタームを返すので、インデックス内の用語には別の#を返します。 –

+0

また、私はファセットに対するルークのスピードをテストしましたが、それはいつもより長くかかります。つまり、Solr 3.6または4.0を使用している場合、それらのバージョンのLukeRequestHandlerで速度が改善されているはずです。 –

関連する問題