Solr 5系はファセットが遅い?

投稿者: | 2016年1月15日

松の内も終わってしまいましたがあけましておめでとうございます。
編集長の佐藤(@akihirosato1975)です。

最近弊社でもそろそろSolr 5.xへの移行を検討しようかということでいろいろ実験してるんですが、その中でちょっと困ったちゃんな状況が判明したのでご報告。それは

「Solr 5.xは一部のファセットが遅い」

というものです(2016年1月現在)。

元々は今Solr 4.x系で動いているサービスを、まずは最低限APIの変更などの修正を行った状態でSolr 5.xに載せ替えて一通り動作確認をして、その上でパフォーマンスチューニングを…と考えていたんですが、どうも検索結果のレスポンスが遅い(一例を上げると、Solr 4系で0.2秒程度でレスポンスしていたのとほぼ同じ設定・データ・スキーマを使っても、Solr 5系では3秒以上かかる)。これはパフォーマンスチューニング以前の問題ということで調べてみたら、

ファセットを使わないqueryだとパフォーマンスの劣化はない
→facet.field以外のファセット(例えばfacet.query)を使う分にもパフォーマンスは落ちない
→facet.fieldを増やしていく度にパフォーマンスの劣化が大きくなる

という状況が判明。そこで「facet.fieldで使用するカラムをdocValue化する」「Solr 5.1で導入されたJSON facet APIを使う」などいろいろ技を試してみたんですがこれも改善せず。

そこで原点に立ち戻って、Solr 4.xと5.xでstatsに何か差が無いかを比べてみたところ、「Solr 5.xではfieldValueCacheが全く使われていない」ことが判明します。しかもsolrconfig.xml等でfieldValueCacheを明示的に有効にしても状況が変化せず。

なぜ?と思い調べてみたら、

http://comments.gmane.org/gmane.comp.jakarta.lucene.solr.user/113489

という記事が見つかりました。この記事の中ほどに

Indeed. Use of the fieldValueCache (UnInvertedField) was secretly removed as part of LUCENE-5666, causing these performance regressions.
This code had been evolved over years to be very fast for specific use cases. No one facet algorithm is going to be optimal for everyone, so it’s important we have multiple. But use of the UnInvertedField was removed without any notification or discussion whatsoever (and obviously no benchmarking), and was only discovered later by Solr devs in SOLR-7190 that it was essentially dead code.

という文がありますが、この

[LUCENE-5666] Add UninvertingReader

が曲者でして、Lucene側で従来のfieldCacheの代わりにUninvertingReaderを導入した際に、fieldValueCacheを使う部分のコードが除去されてしまったようです。

Solr側でも問題は認識されていて、

[SOLR-7730] speed-up faceting on doc values fields
[SOLR-8096] Major faceting performance regressions

という形で解決に向けた動きはいくつか出ていますが、完全な解消には至っておらず。とりあえず現状で回避策としては「Solr 4系の最新版を使い続ける」しかないっぽいです。
この点についてはまた続報が入り次第記事にしたいと思います。