強烈に素晴らしいプロダクトに変貌した Apache Solr - Solr 4.0 登場

Apache Solr 4.0 がリリースされた。
本記事では Solr 4.0 の新機能や改善された点のうち気になるものを紹介する。

概要

Solr 4.0 では、下記の変更が入る。

  • 83 個の新機能
  • 13 個の最適化
  • 121 個のバグ改修

Solr 4.0 はメジャーバージョンアップにふさわしい、非常に強力なリリースとなる。


SolrCloud

Solr 4.0 の数ある新機能のうちの目玉機能。
SolrCloud という名前から推測できるように、Solr の分散構成が行えるようになった。とはいうものの、Solr 3.6 以前でもレプリケーションは行えたのだが、Solr 4.0 は一味ちがう。 今までより断然賢くなった。シャーディングもクラスタリングも簡単な設定で行うことができる。インデクス書き込みも複数ノードから行える。そしてなにより自動フェイルオーバーができるようになった。

さらに SolrCloud が今までより賢いのは、今回からどのノードでも検索結果がすぐ反映される、リアルタイムサーチ(っぽい)ものが出来るようになった。今まではインデックスをコミットしない限り検索には反映されなかったので少々のタイムラグがあった。が、 Solr 4.0 からは softCommit という仕組みができたことにより、ほぼリアルタイムでの検索が行えるようになった。softCommit にはもうひとつ素晴らしい点があり、通常のコミット(softCommit と対比して hardCommit と呼ばれる)は非常に重い処理で数分間に1度程度しか行うことができなかったが、softCommit は毎秒行えるレベルの処理量しかないので高速に行える。


検索結果にシャード情報を含めたり、(Solr ノード間の二相コミットで使用する) prepareCommit が呼べたりと、分散構成に関してかなり強力になったと言えるだろう。


インデクシング速度の向上

Solr のページを見る限りこの件についてはプッシュされていないが、とても強力な改善点だ。
Solr はスケールアップよりスケールアウトを念頭に置いている事もあってか、Solr 単体でのインデクシング速度の性能はあまり良いものではなかった。というのも、全文検索エンジン Solr のパフォーマンスチューニングについて にもある通り、3.6 以前はインデクス書き込みが全て直列化されていて不要なロック解放待ちが発生していたからだ。だが Solr 4.0 ではこのロジックが改良され、処理を全て直列化するようなことはなくなった。これでインデクス書き込み性能は大きく向上するだろう。


キャッシュ方式の追加

Solr のキャッシュ方式は LRU のみだったが、 LFU も選択できるようになった。

  • LRU (Least Recently Used) : 最近参照されたデータを残して、長時間参照されていないデータから消していくアルゴリズム。
  • LFU (Least Frequently Used) : 参照回数を保持し、参照回数が多いものを残して参照回数が少ないものから消していくアルゴリズム。

ランキングアルゴリズムの充実化

下記ランキングアルゴリズム追加された。もちろんこれらは設定ファイルの変更によって利用可能になる。

クラス名 アルゴリズム
BM25SimilarityFactory Okapi BM25
DFRSimilarityFactory Divergence from Randomness models
IBSimilarityFactory Information-based models
LMDirichletSimilarity LM with Dirichlet smoothing
LMJelinekMercerSimilarity LM with Jelinek-Mercer smoothing


それぞれアルゴリズム名でググればどういうアルゴリズムなのか出てくるが、少々高度だ。が、とにもかくにも選択肢が増えるのは良いことだ。


UpdateProcessorFactory の充実化

インデクスの追加時、データをどのように整形してインデクスデータに格納するか。Solr はそのあたりは既にある程度柔軟に行えるが、柔軟に行いたい場合は自分でクラスを書く必要があった。しかし Solr 4.0 ではデフォルトで提供される UpdateProcessor(Factory) が増え、より扱いやすくなった。

今回増えた UpdateProcessorFactory 一覧。

  • RemoveBlankFieldUpdateProcessorFactory
  • TrimFieldUpdateProcessorFactory
  • HTMLStripFieldUpdateProcessorFactory
  • RegexReplaceProcessorFactory
  • FieldLengthUpdateProcessorFactory
  • ConcatFieldUpdateProcessorFactory
  • FirstFieldValueUpdateProcessorFactory
  • LastFieldValueUpdateProcessorFactory
  • MinFieldValueUpdateProcessorFactory
  • MaxFieldValueUpdateProcessorFactory
  • TruncateFieldUpdateProcessorFactory
  • IgnoreFieldUpdateProcessorFactory

反復記号の正規化

日本語圏の我々にとって嬉しい機能。
日本語には々, ゞ, ゝ, ヽといった、前の文字の繰り返しを表す 踊り字 というものがある。これらの文字を正規化できる JapaneseIterationMarkCharFilterFactory というクラスが追加された。これを利用すると、「みすゞ」という文字列を「みすず」という検索ワードでマッチさせることができるようになる。このような日本語対応を入れてくれるのは嬉しいかぎりだ。


簡易 JSON delete クエリ

かつての Solr では JSON で delete クエリを発行する場合、下記のような JSON を発行していた。

{ "delete" : { "id" : "ID123" } } // ID123 を削除

しかし Solr 4.0 からは下記のように書ける。

{ "delete" : "ID123" } // ID123 を削除
{ "delete" : ["ID123", "ID124"] } // ID123 と ID124 を削除

簡易化できるのは ID 指定時のみで、クエリで削除したい場合にはこの簡易表記は使えないようだ。


リッチになった管理ツール

Solr の管理ツールがリッチになり、かつ新しいオプションも多数増えた。下記画像はほんの一例だが、新管理ツールがどのようなものかをざっくりとでも伝えられるだろう。
Core Admin 画面

Analysis 画面


121 件ものバグ改修

新機能に加え、121 件ものバグ改修が含まれている。

クラッシュした場合に Solr を再起動しても稼働しなくなる不具合、処理があるところから動かなくなる突然死、ハイライトフィルタを複数回初期化してしまうなど運用でカバーしきれない不具合もあった。Solr を運用している人なら、ログを追うと Solr 内部の手の出しようが無いところで例外が出ているところを見たことがあるだろう。これらは全て改修され、強靭な Solr へと変貌している。

Solr のバグには正直泣かせられることもあったが、今のところ我々が遭遇したものは全て Solr 4.0 で改修されている。


注意点1

Solr 4.0 はインデクスデータのフォーマットが変わったため、過去バージョンのインデクスをそのまま読むことはできない。したがって、既存の Solr でシステムを構築している場合は再インデクスを行う必要がある。


注意点2

Solr を利用するための Java クライアント、SolrJ にも変更が入っており、後方互換性が失われている。幾つかクラス名の変更などを求められるので、SolrJ を使っている場合はほんの少々の修正が必要となる。


補足

ここで挙げた新機能等はほんの一部であって、これ以外にも非常に多くの修正や最適化が施されている。


まとめ

前回の記事 では「Solr はじゃじゃ馬」と書いたが、今回のバージョンアップでかなりまともな、―いや、優れた― 馬になった。 Solr は 4.0 で強烈に素晴らしいプロダクトになった。
この勢いのまま突っ走り、全文検索エンジン界の ブケパロス となってほしいものだ。