Solr
Solrに関するTipsをこちらに記載します。
概要
SolrはApacheのLuceneのサブプロジェクトのひとつです。
Solrは全文検索システムで、Tomcatのようなアプリケーションサーバー上で動作します。
http://lucene.apache.org/solr/
SolrはLuceneをベースに作成されており、Luceneに対してWEB管理画面やキャッシュ機構を取り入れたアプリケーションとなっています。
SolrはJavaで作成されていますが、Solrにアクセスするクライアントはjava以外にも様々な言語(rubyやPHP等)で用意されており、データへのアクセスはRESTライクにXML/HTTPでアクセスすることが基本として作成されています。
クライアントはこちら
また、ローダーも用意されており、CSVやTSVといったファイルを指定してデータを取り込むことも可能です。
v1.3からはDataImportHandlerが追加されたので、JDBC経由でRDBから直接データを取り込むことも可能です。
あまり技術情報に関する日本語ドキュメントが存在しないので、基本的に英語ドキュメントから調査することが多いです。
また、日本語での書籍も以下の本しかないらしいのですが、こちらの本のみである程度の問題は解決できるかと思います。
Apache Solr入門 ―オープンソース全文検索エンジン
詳細
使用感
- DynamicFieldのおかげで項目を動的に追加できかなりパワフルなことが行えます。
- ユニークキーのみ用意して、クライアントを利用する側でDTOの項目を追加や削除するだけでSolrの項目追加が行えたりします。
項目削除ではなくを項目の非利用といったかたちになり、変更前に登録したデータについては値が残っている状態になります。 - こちらに似ていますが、CopyFieldの新規指定も指定しアプリケーションサーバーが再起動し適用された後から指定した項目へのコピー設定が行われます。
- ユニークキーのみ用意して、クライアントを利用する側でDTOの項目を追加や削除するだけでSolrの項目追加が行えたりします。
- レスポンスが早いです。
- 1600万件程度の検索の場合、複雑な条件を設定しても1~3秒程度で返却されます。
但し、返却対象のレコード数が多くなると遅くなります。offset=10とoffset=100で結構違います(offset=10がデフォルトっぽいです)。
- 1600万件程度の検索の場合、複雑な条件を設定しても1~3秒程度で返却されます。
- データはディレクトリ内のファイルに存在するだけなので、データディレクトリをリネームやデリートするだけでアプリケーションサーバー動かしたままレコードの全件削除とかできます。
- 1スキーマ=1ポート利用することになるので、複数のスキーマを利用する場合はその分ポートを用意する必要があります。
- 接続URLで扱えるデータが明確に変わるので分かり易いです。
- schema.xmlに項目を追加してもアプリケーションサーバーを再起動すればすぐに反映される上、項目に対する制限が緩いのでエラーで落ち辛いです。
- 元々存在したユニークキーから新しく追加した項目をユニークキーにして、追加項目の値が存在しない場合でもエラーになりません。
- 部分更新ができないのが面倒です。
- 一部の項目を更新する場合は、上書き更新(デリートインサート?)されるようです。
用語
- Schema
- スキーマ。
XMLで記載され、Solrの項目に関して記載されています。
こちらに「項目AはString型で複数の値を持ちindexを設定する」といった情報や、「項目A、項目Bの値を項目Cにコピーする」といった設定を記載します。 - DynamicField
- ダイナミックフィールド。
プレフィックスやサフィックスを固定した項目名をワイルドカードで指定しておき("*_s"や"l_*"といった記載)、そのプレフィックスやサフィックスの項目名となる項目が利用された場合に動的に追加され、事前にschema.xmlに記載されている項目と同様に利用することができる項目となります。 - CopyField
- コピーフィールド。 データを登録する際に、指定した項目の値をコピー先の項目に値をコピー設定します。
複数項目をひとつの項目にコピー設定する場合は、後述のMultiValued設定が必要です。
また複数の値が登録される場合の挙動は、指定された項目が連結して登録されるのではなくリストとして登録されるイメージとなります。 - MultiValued
- マルチバリュー。
名称通り1レコード辺り複数の値を登録することができる項目となります。
リストとして登録されるイメージとなります。 - 日付型
- 項目の型で date や pdate といった日付型が存在しますが、フォーマットは "yyyy-mm-ddThh:mm:ss.sssZ"といったように、日付と時間のセパレータとして T 日付の最後に Z がつくようになっています。
また、動作環境によってはタームゾーンの +9:00 といったものが付く場合もあります。
タイムゾーンについてはかなり癖があるので利用する際は注意して下さい(実案件でも色々と問題になりました)。 - 全文検索
- Solrのschema.xmlで指定されたTokenizerを利用する項目に対して行われます。
こちらのTokenizerによって形態素解析やN-gram解析といった検索を行います。
形態素解析でヒットする場合とN-gram解析でヒットする場合に違いがありますので注意して下さい。
初期状態だと入っていないようなので導入する必要があります。 - 形態素解析
- 詳しくはこちら
実案件では形態素解析は sen を利用していました。 http://java.net/projects/sen/
人間が利用する自然言語の単位に分割してその中に一致するものが存在すればヒットする形になります。
初期状態だと入っていないようなので導入する必要があります。 - N-gram解析
- 詳しくはこちら
指定した文字数単位で文字列を分割してその中に一致する値が含まれるかをチェックします。例)"本日は晴天なり"を2-gram解析した場合 "本日/日は/は晴/晴天/天な/なり" といったように指定したgram単位で文字列が分割されます。 "晴天"で検索した場合、分割した中に"晴天"と完全一致する文字列が存在するのでヒットします。 "本日は"で検索した場合、分割した中に"本日は"が存在しないのでヒットしないように見えますが、Solrのtext_cjkというN-gram解析の項目では検索後もN-gram解析され、"本日/日は"で検索されらしくヒットします。 "は"で検索した場合は、分割した中に"は"と完全一致する文字列が存在しないのでヒットしません。
- SolrAdmin
- Solrの管理画面。
条件を入力してのデータ検索・参照(XML形式)、検索条件の解析結果(形態素解析の場合どう分割して検索されているか)といったことが見れるのでかなり便利です。
例) "本日は晴天なり" を形態素解析した場合 "本日/は/晴天/なり" のように名詞や動詞、助詞、接続詞といったように検索対象となる文字列を辞書に登録されている単位で分割します。 "晴天"で検索した場合、分割した中に、"晴天"と完全一致する文字列が存在するのでヒットします。 "天な"で検索した場合は、完全一致する文字列が存在しないのでヒットしません。 例は簡略化する為に文字列の分割(解析結果)を1種類しか書いていませんが、実際には何種類かの解析を行った上で存在するかのチェックが行われます。
サンプルの実行
- Solrのホームページからモジュールをダウンロードします。
- ダウンロードしたファイルを解凍して下さい。
- 解凍したファイルにサンプルが入っているのでこちらですぐにSolrを動かしてみることができます。
特に変更しない場合は、jetty上で起動します。
## 以下のコマンドでSolrを起動できます。
java -jar start.jar
- http://localhost:8983/solr/
- Solrのデフォルトのポート番号は8983です。
- ポート番号を変更する場合は /example/etc/ 配下の jetty.xml を変更する必要があります。
以下のportを指定したいポートに変更して下さい。
<!-- This connector is currently being used for Solr because it showed better performance than nio.SelectChannelConnector for typical Solr requests. --> <Call name="addConnector"> <Arg> <New class="org.mortbay.jetty.bio.SocketConnector"> <Set name="host"><Set name="port"> <Set name="maxIdleTime">50000 <Set name="lowResourceMaxIdleTime">1500 <Set name="statsOn">false </New> </Arg> </Call> ![]()
## example ディレクトリにある exampledocs 配下に移動します。 cd exampledocs java -jar post.jar solr.xml monitor.xml java -jar post.jar *.xml ## 登録したデータは /example/solr/data 配下に登録されます。
- QueryStringは検索条件となります。
- *:* は全件検索となります。
- example ディレクトリの名称
- example/etc/jetty.xml のポート番号
- example/solr/conf/schema.xml のスキーマ定義(項目や利用するフィールドタイプ、コピーフィールドといった内容の修正)
- 日本語対応の形態素解析を導入する場合は sen 等を導入する必要があります。
- N-gram解析を導入するにはluceneを導入する必要があります。
- 導入方法は形態素解析の導入の参考ページを参照して下さい。
コメント