Edited at
SolrDay 13

Lazy Field LoadingとConstant Score Query(Scaling Lucene and Solrより)

More than 1 year has passed since last update.

Solr Advent Calendar 2016 の13日目です。

アドカレ用に何かネタが無いかなと漁っていたらLucidWorksさんのブログにこんな記事がありました。

11 Common Mistakes in Search

この記事にScaling Lucene and Solrが引用されていました。

内容はパフォーマンスチューニングのベストプラクティスを紹介しますというものだったので、その中から個人的に気になったものを紹介します。

記事自体は2009年とかなり古いですが、引用元の記事は今月(2016年12月)投稿されたものですし、まだ通用しそうなものを紹介します。


enableLazyFieldLoading

SolrにはDocument CacheというStoredされているフィールドをメモリに格納しておき、インデックスを直接見ないようにするキャッシュがあります。

しかし、必ずしもStoredされているフィールドを全てメモリに置く必要は無いため、flで指定されたものだけを格納するenableLazyFieldLoadingという設定があります。

この機能の効果は主に2つでメモリの節約とキャッシュ生成のコストを削減できることです。

前者に関してはそのままですが、個人的には後者が恩恵が大きいケースが結構あるのではと思っています。

検索エンジンを組み込んだシステム開発において、システムの簡略化のためにAPIへの問い合わせを極力少なくしたいので、出来る限り検索エンジンに表示用データを持たせたいことがあります。

(このようなシステム設計自体が良いのか悪いのか、微妙な気もしますが・・・)

そのようなケースでは必然的にstored=trueのフィールドが増えるため、enableLazyFieldLoadingでキャッシュ生成のコストを抑えることで、検索時のqtimeを改善できそうだなと思いました。

ただし、SolrでのdocValuesとstoredの使い分けでも言及されている通り、Solr-6.3系以降はstored=trueの使い道は今後少なくなっていくのでは?とあるので、この機能がdocValues(もしくはstoredAsDocValues)=trueのフィールドに対してどうなるかが気になるところです。


Constant Score Query

ドキュメントへのスコア計算は通常BM25(もしくはTF-IDF)で計算されますが、それをクエリブーストで固定する機能です。

この機能のメリットはスコア計算の式をスキップできるところにあります。

インデックスが大きく、クエリにヒットするドキュメント数が多いケースでは検索のパフォーマンス改善が期待できそうです。

なお、Luceneのレイヤーではクエリブーストとインデックスブーストしか受け付けなくなるBooleanSimilarityが導入されています。

詳しくは @ouava さんが 11日目にBooleanSimilarity所感で紹介しています。


まとめ

個人的にまだ試したことの無いパフォーマンスチューニング(特にqtimeを改善する点で)をメモ的な意味合いも込めて紹介しました。

enableLazyFieldLoadingに関してはsolrconfigに設定を書くだけの手軽さもあるので、そのうち試したいなという印象です。


その他、参考にした資料

https://wiki.apache.org/solr/SolrCaching#documentCache

https://issues.apache.org/jira/browse/SOLR-7218