当社Webサイト

カテゴリー

Amazonサーチ

  • 05/20
    Lucene, Solr, 全文検索 post by kubo@eni.co.jp @ 2009 年 5 月 20 日 18:22
    このエントリーは、なるべく定期的に最新情報に更新するようにしています。

    更新履歴

    はじめまして。
    株式会社イージーネット プロダクト&サービス事業部の久保です。

    当社では、

    • ネットワークフォレンジック アプライアンス製品で、メールアーカイブとしても使えるNetRAPTOR
    • Adobe AIRによるデスクトップアプリケーションによってドラッグ&ドロップや右クリックから「送る」での一発送信機能に対応した、大容量ファイル送信システムのeasyFiLEX

    などを開発しております。

    今日は、当社で利用しているOSSの全文検索サーバアプリケーションであるApache Solrについてご紹介したいと思います。

    GoogleでSolrを検索しても、日本語圏のコンテンツはまだまだ少ないようです。
    当社がSolrを使い始めた昨年は現在よりもさらに少なく、結構苦労しました。
    今回はやや雑多な内容となりますが、新しくSolrを使う際に必要と考えられる情報をまとめてみました。

    本エントリーでは、Solr1.3を対象としています。
    Solr1.3が現在の安定版で、Solr1.4-devが開発版となります。

    目次

    Solrとは

    Apache Solrは、OSSの全文検索のエンジンとして有名なApache Luceneをベースに、

    • HTTPでの入出力(サーバアプリケーション化)
    • 管理Webアプリケーション
    • キャッシュ機構

    などの機能拡張を行ったJavaのWebサーバアプリケーションです。
    単純に言うと、LuceneのHTTPラッパー+拡張機能ということになります。
    Javaのサーブレットアプリケーションなので、Tomcatなどのアプリケーションサーバに配置することになります。

    サーバ側だけではなく、SolrJなどのSolrクライアントが揃っているのもポイントです。
    IntegratingSolr – Solr Wikiにあるように、SolrクライアントはJava以外の実装(PHP,Ruby,Pythonなど)もあります。

    Solrを使ったシステムの開発方法

    Solrを用いたシステムの開発者は、以下のようなことを行うことになります。

    Solrサーバ側
    Tomcatなどのアプリケーションサーバ上へのSolrの配置、設定、スキーマ設計、チューニングなどを行います。
    基本的には、コーディングは不要です。
    Solrクライアント側
    Solrクライアントを使ったXML/HTTPでの操作を行います。
    Java,PHP,RubyなどにバインディングされたSolrクライアント実装を用い、Solrサーバを操作します。
    XMLではなくCSVを用いたり、HTTPではなくJDBC経由でRDBからデータを追加したり、といったこともできるようです。

    おすすめする方

    以下のような方には、様々な言語からHTTP/XMLで手軽に全文検索ができるSolrをおすすめします。

    • Luceneを使いたいが、Luceneを直接触るのは大変そうだと考えている方
    • Luceneを使いたいが、クライアントとしてJava以外の言語を使いたい方
    • 簡単に全文検索アプリケーションを使いたい方
    • スケーラブルな全文検索アプリケーションを使いたい方

    機能一覧

    公式サイトの機能一覧で、機能の一覧が確認できます。
    まず最初にここに目を通すことをおすすめします。

    日本語のWebリソースとしては、InfoQの以下の記事で概要がつかめます。

    実績/事例

    PublicServers – Solr Wikiで、海外での実績一覧が確認できます。
    国内では、以下のような事例が見つかります。

    (2009/07/26追記)
    また新しい実績や事例として、Solr勉強会で出ている各種事例が参考になりそうです。

    データ量/性能とハードウェア

    ハードウェアやデータ内容やその他様々な要素が関わってきますので一概には言えませんが、当社で検証した際の感触では
    特に念入りなチューニングをしなくても(※2)、Quad Core CPUと4GB以上のメモリとそれなりに高速なディスクがあれば、1台で少なくとも数百万件オーダーのデータ(※1)には対応できる※3
    という感じになります。

    ※1 ここでは、30フィールドほどあるそれなりに大きめのデータのケースを想定しています。ぼうずの日常的雑感 – Solr のメモリについての体験談でご指摘のように、データによってかなり結果は異なってくると思いますし、またJVMが32bitか64bitかによってメモリ使用量が異なるようです。また、同ブログのSolr のメモリ使用量を小さくするには、メモリ使用量の調整の方法が記載されています。
    ※2 最低限のチューニングは必要でした。後日別エントリで紹介したいと思います。
    ※3 (追記)検索と更新を同時に行うような場合は、パフォーマンス問題が発生する可能性があります。検索と更新も併せて参照ください。

    詳細は次の通りです。

    • 基本的には他のデータベースと同様にI/Oバウンドなアプリケーションとなりますので、ディスク性能があった方が良いです。
    • 大量のデータを扱う場合、Solrのキャッシュ機構の影響か、Luceneに比べてもメモリを大量に消費する気がします。メモリは4GB以上を最初から検討しておいた方が良いです。
    • よって、最初から64bit OSを検討しておく必要があります。
    • 大量のスレッドを使用するマルチスレッドアプリケーションとなりますので、CPUも出来ればQuad Core以上の方がよいと思います。同時検索数で違いが出てきます。

    後述のようにSolrはスケーラビリティに優れていますので、複数のハードウェアを並べて分散検索や数千万から一億程度のデータも扱うことが出来るようです。(当社では検証出来ていませんが)
    Solr(Lucene)で扱えるドキュメント数については、以下のURLが参考になります。

    マルチコア構成

    Solrには「コア」と呼ばれる概念があります。
    以下、株式会社ロンウイット/ダウンロードにあるホワイトペーパー『RONDHUIT REPORT Vol.4 「Solr 1.3の新機能」(全2ページ)』から引用します。

    Solrには「コア」のオブジェクトがあり、検索リクエストを処理する各種リクエストハンドラ、検索を実行するサーチャー、インデックスのスキーマ定義、各種ツール・オブジェクト等さまざまなデータを保持している。Solr 1.2まではSolrインスタンスにコアは1つであったが、Solr 1.3からは複数持てることになった。これがマルチコアである。

    複数のSolrアプリケーションが必要な場合、一般的にはSolr1.3から実装されたマルチコア機能を用いて1つのサーブレットアプリケーションで実現することができます。
    マルチコア構成では、コアごとにデータ、アプリケーション設定、スキーマ(DB定義)を別々に定義できます。(追記: 同じ設定ファイルを使うのも勿論OKです)

    1
    2
    3
    4
    5
    6
    7
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <solr persistent="true" sharedLib="lib">
      <cores adminPath="/admin/cores">
        <core name="core1" instanceDir="core1/" config="/solr_home/conf/solrconfig1.xml" schema="/solr_home/conf/schema1.xml" />
        <core name="core2" instanceDir="core2/" config="/solr_home/conf/solrconfig2.xml" schema="/solr_home/conf/schema2.xml" />
    </cores>
    </solr>

    またアプリケーション稼働中に動的にコアの追加/削除/リロードなどが可能になっていますので、運用をしながらコアの増減や設定変更を行うことができます。
    (参考: CoreAdmin – Solr Wiki)

    ちなみにSolr1.2までの場合には以下の方法で対応していたと思いますが、Solr1.3の上記マルチコア機能により、それらは必要なくなったようです。

    Solrのスキーマで、論理的なアプリケーションを区別する識別子を持っておき、1つのSolrを用意
    この場合、スキーマやデータは一つとなります。
    複数のSolrアプリケーションをアプリケーションサーバにデプロイする
    この場合、スキーマやデータは複数となりますが、大量のアプリケーションがデプロイされることになりますので、リソースを消費します。

    一概に『全文検索サーバアプリケーション』と言っても、Solrは多機能です。
    重要な機能としては次のようなものがあります。

    単語検索/LIKE検索(完全一致/部分一致)
    OracleやPostgreSQLと同じく、通常の単語検索やLIKE検索を行うことができます。それにより、完全一致/部分一致での検索を行うことができます。
    全文検索
    形態素解析やN-Gramと呼ばれる方式により、全文検索を行うことができます。
    ファセット検索
    例えば日付範囲や、カテゴリーなどの「ファセット」ごとの検索結果件数を簡単に取得したり、そこからさらに絞り込み検索を行ったり、ということができます。
    サンプルとしては関口宏司のLuceneブログ – ブログ検索デモがあります。
    (参考: Luceneブログ内検索デモのリニューアル | 関口宏司のLuceneブログ)
    見て分かる通り、カテゴリをクリックするとその検索結果が表示されますが、検索結果画面の右サイドバーからさらに絞り込みが行えます。

    この機能の使いどころとしては、例えば次のようなことがあります。

    • キーボード入力無しで、簡単に絞り込み検索を実現できる
    • カテゴリごとの集計結果を利用した統計情報が簡単に取得できる
    重み付け検索
    特定のフィールドに重みを付けた検索結果を得ることができるようです。
    ヒット件数が数十万件を超えるような場合でも使える。新しくインデキシングしたドキュメントを検索結果の上位に表示する2つの方法。 – Solr, Python, MacBook Airが参考になりそうです。(フレッシュネスブーストというようです)
    分散検索
    複数のSolrサーバに対し、検索を実行することができます。詳しくはスケールアウトを参照ください。

    スケールアウト

    Solrは以下のような方法でスケールアウトが出来ができ、1億を超えるドキュメントを扱うことが出来るようです。

    • Solr1.3から実装されたDistributedSearch(分散検索)機能を用いれば、複数のSolrノード(=Shards)に振り分けたデータに対して1リクエストで同時に検索が実行できます。
      DistributedSearch部分のソースコードを見る限りThreadPoolExecutorで複数のShardsにマルチスレッドで検索しますので、Solrノードを増やしても処理速度はほぼ一定に保たれると考えられます。

      なおデータを何らかの規則でパーティショニングしておけば、分散検索を用いなくても特定のSolrノードに対して検索を実行すれば良くなりますので、そのような設計も検討することができます。
    • レプリケーション機能を用いれば、同一のデータを持つSolrノードを複数持つことができます。検索を複数のSolrノードに振り分けることで、1つのSolrノードの負荷を下げることができます。

    検索と更新

    当然ですが、大量の検索と更新が同時に発生する場合、どうしてもパフォーマンスに問題が発生します。
    レプリケーション機能を用いて検索サーバと更新サーバを分けることも出来そうですが、
    例えばインデクシングにリアルタイム性が求められないのであれば、
    夜間バッチで前日分の更新を行うなどの対応も検討することができます。

    ここでは、これから実案件などでSolrの利用を検討している方に、参考になるような情報源をいくつかに分けて紹介したいと思います。

    全体像をつかむ

    全文検索システム「Solr」徹底活用ガイド(Software Design 2007年12月号)
    本記事の内容は本エントリー内の使ってみるというところで紹介していますが、ただのインストールだけではなく幅広い内容を扱っており、おすすめです。
    公式サイト
    機能一覧FAQなどに最初に目を通されることをおすすめします。

    特に機能一覧は重要です。
    Solrはかなり高機能なので、思いもよらぬ機能が入っていることもあります。

    例えば

    Distributed search with sharded index on multiple hosts

    とあるのを見ると、複数のSolrホストにまたがった分散検索が出来そうだということが分かります。

    株式会社ロンウイット/ダウンロード
    Lucene/Solrのコミッターである関口氏の会社の資料ダウンロードページです。どの資料も、日本語の情報としては貴重なものです。
    リクルートにおける検索エンジンSolrの活用(PDF形式)
    Solrの概要の他、技術系の話も交えた採用への道筋が載っており、非常にためになります。
    Apache Solr でもっと賢く検索する: 第 1 回 基本機能と Solr スキーマ
    Apache Solr でもっと賢く検索する: 第 2 回 エンタープライズに対応した Solr
    developerWorksの記事です。2007年の記事なのでやや古いですが、出来ることを設定ファイルや画面を関連づけて知ることが出来るため、分かりやすいと思います。

    Solr1.3について知る

    昨年秋に、Solr1.3がリリースされています。
    以下のサイトでは、Solr1.3での変更点などを知ることができます。

    使ってみる

    今回あらためてGoogleで調べてみましたが、日本語リソースとしては、これからSolr1.3を使う方を対象とした分かりやすいインストール、設定のドキュメントで決定版と言えるものが2009年05月18日現在はまだ無いように思います。

    私が昨年Solr1.2の時点で最初に参考にしたのは、以下の情報です。

    全文検索システム「Solr」徹底活用ガイド(Software Design 2007年12月号)
    上でも紹介したリクルートにおける検索エンジンSolrの活用を書かれた方の記事です。

    • LIKE検索と全文検索の違い
    • 形態素解析とN-gramとの違い
    • Solrのセットアップ
    • Solrのカスタマイズとチューニング
    • Solrに付属の同期スクリプト

    など、幅広い話題を扱っており、非常に参考になります。

    開発中、常に参照する

    Apache Solr(公式サイト)
    Solrの公式サイトです。FeaturesやTutorialやJavaDocなどがあります。
    Solr Wiki
    Solr関連の公式Wikiです。不明な点があれば、Googleよりも最初にここで検索するのがよいと思います。インストール方法、設定、使い方、チューニング、など様々な情報があります。
    ソースコード
    Solrはオープンソースなので、いつでもソースコードを参照できます。私もSolrJを使っていて問題に遭遇しましたが、ソースコードを参照することで問題解決しました。(参考: Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法))
    (Thanks to ぼうずの日常的雑感様)

    その他有用なサイト

    関口宏司のLuceneブログ
    LuceneおよびSolrのコミッターである関口さんのブログです。国内のブログでは一番と言っていいほどの新しい情報、濃い情報が入手できます。
    Solr, Python, MacBook Air
    Solrに関する検証記事などが多数あり、参考になります。
    hadoopとかsolrとかの実験
    Solrに関するいくつかのページがあります。細かい内容も載っているため、参考になりそうです。
    ぼうずの日常的雑感
    SolrやLuceneに関する検証記事などがあります。1.4の話題や、DataImportHandlerなどの記事があります。
    第4回 全文検索エンジン「Lucene/Solr」の用途と良さ
    IT Proで始まった記事です。そもそも全文検索エンジンとは、というところから始まっているので、参考になります。(連載INDEX)

    終わりに

    今回はSolr1.3の紹介が主となりましたが、
    次回以降、サンプルコードや最低限のチューニング設定などの公開も予定しています。

    それではどうぞ楽しいSolr生活を!

    あわせて読みたい

    Tags: , , , , , , , , ,

2 Responses

WP_Cloudy