Solr って何者?①:Solr って何??

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回は Apache Solr (Solr) というやつを試そうとしてみたので、それについてのお話です。
非常に尖った用途を持つ OSS で、(私のように) 使う機会がなければ恐らく馴染みのないものかと思いますが、だからこそ必要になりそうな時に存在を知っていると選択肢が増えそうだなぁ、と思えるものなので、そのあたりを頑張って伝えていきたいと思います。

■Solr って何?

Solr は、全文検索というものを行うための OSS です。

全文検索……ってつまりどういうことをするの?というのをものすごくざっくり言うとデータを登録しておいて」後に「登録済みのデータから検索を行う」ものです。
リレーショナルデータベース (RDB) をご存じであれば、それに近いことをやるのかな、とイメージするとわかりやすいかもしれません。
大まかな流れを先に確認してみましょう。

Solr では基本的に、まず登録するデータに合わせてスキーマと呼ばれる型を作成します。
スキーマは複数のフィールドから成り、それぞれのフィールドには “フィールド名” や “型 (文字列、数値など)” などを設定します。
例えば、”料理” のスキーマならフィールドは “名前”、”材料”、”調理時間目安”、”調理手順”……など、”本” のスキーマならばフィールドは “タイトル”、”著者”、”発表年”、”冒頭文”、”概要”……などが考えられます。(実際には登録するデータに合わせて考える必要があります。)

スキーマを作成したら、決められた書式に合わせて用意しておいたデータを登録します。
(こうして Solr に登録したデータは、ドキュメントと呼ばれます。)
ここまでが前準備です。

そうしたら、Solr に対して問い合わせ (クエリ) を発行すると、該当するドキュメントを結果として返してくれる……というわけです。

Solr でやること・やれることは、極めて大まかにですが大枠としては以上です。
用語こそ違えど、概要を見る感じは RDB と似たようなものですね。

では改めて Solr の、というか全文検索の特色は何かと言うと……文字列検索に特化しておりとにかく検索が早いことです。
例えば、先に挙げたスキーマ例で言えば「”名前” “材料” “調理手順” のいずれかに『蒸し』を含むドキュメント」のような検索を、solr は極めて高速に行うことができます。
RDB でも “LIKE 句” によって同じようなことはできますが、原則として RDB はこのような「特定の文字列を含む」という検索は得意とはしておらず、検索対象の DB サイズが大きくなるほど極端に遅くなりがちです。
また Solr は、例えば「いちご」で検索することで「イチゴ」「苺」「ストロベリー」を含むドキュメントも検索できるようにするような同義語・類義語検索や、あいまい検索などを実現できる仕組みなど、我々が「検索」と聞いたときにイメージするような機能を実現できるものになっています。
逆に Solr は、集計や結合処理などの RDB の得意とするような処理には適しているとは言えません。

ところで、Apache のソフトウェアの中には Solr と同じく全文検索のための OSS である Lucene というものが存在しています。

Solr の話を見ていると稀に名前の出てくるこの Lucene についても簡単に触れておくと、
Lucene は Java (および Python) 向けの組み込みライブラリの OSS であるのに対して、
Solr は Lucene をベースにしている派生の OSS であり、Web API や Web UI などを備えるサーバ向けアプリケーションです。

Solr では Lucene でできることは概ねできる、とされており、単体で動かせるアプリケーションであることからも、とりあえず「全文検索」がどんなものか体感したいのであれば Solr を試してみるのがよいかと思います。

■Solr をほんの少しだけ試してみる

さて、ざっくり概要についてお話ししてみましたが、話だけではわかりにくいと思うので少し試してみましょう。

Solr を試すなら、公式の配布しているコンテナイメージを使うのが恐らく最も手軽でしょう。
今回は Red Hat Enterprise Linux 9 環境で Podman を使って試してみます。
コンテナイメージが現在どこで配布されているかやコンテナ以外での導入方法については、公式のダウンロードページから確認してください。

さて、Podman を導入済みであれば、以下のようなコマンドを実行すればデモ用データ付きの Solr を立ち上げることができます。簡単ですね。

$ podman run -dt --name test-solr -p 8984:8983 solr solr-demo

実行したら、まずは管理用の Web UI に接続してみましょう。
任意の Web ブラウザを立ち上げ、(上記の例で立ち上げた場合は) 以下のような URL にアクセスしてみましょう。

http://(IPアドレス or ホスト名):8984/solr

すると、このようなページが表示されるはずです。

表示された管理用画面ではいろいろなことができますが、とりあえず今回はデモ用データの確認できるクエリのページだけ確認しておきましょう。

この画面の画面下部にある “Execute Query” ボタンを押下すると、登録されているデモ用データの一覧が表示されるはずです。
(UI で条件を指定してやれば、条件に合致したものだけが表示されます。)

一方、既定の URL へのアクセスによって直接検索結果を取得することもできます。
例えば、デモ用データの中から “name” フィールドに「drive」を含むものを取得したいなら、デモ用データのあるコア (ドキュメントを入れる大枠のようなもの) は “demo” という名前になっていますが、この場合は以下のようなアドレスにアクセスすれば OK です。

http://(IPアドレス or ホスト名):8984/solr/demo/select?q=name%3Adrive

※ “%3A” = “: (コロン)” を URL エンコードしたもの

例として、Podman で Solr を実行したホスト上から curl を使って先述のアドレスへアクセスすると、以下のようにデフォルトの JSON フォーマットでの結果が返ってくるはずです。

$ curl 'http://localhost:8984/solr/demo/select?q=name%3Adrive'
{
  "responseHeader":{
    "status":0,
    "QTime":41,
    "params":{
      "q":"name:drive"
    }
  },
  "response":{
    "numFound":2,
    "start":0,
    "numFoundExact":true,
    "docs":[{
      "id":"6H500F0",
      "name":["Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300"],
      "manu":["Maxtor Corp."],
      "manu_id_s":"maxtor",
      "cat":["electronics","hard drive"],
      "features":["SATA 3.0Gb/s, NCQ","8.5ms seek","16MB cache"],
      "price":[350.0],
      "popularity":[6],
      "inStock":[true],
      "store":["45.17614,-93.87341"],
      "manufacturedate_dt":"2006-02-13T15:26:37Z",
      "_version_":1796378465704869888
    },{
      "id":"SP2514N",
      "name":["Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133"],
      "manu":["Samsung Electronics Co. Ltd."],
      "manu_id_s":"samsung",
      "cat":["electronics","hard drive"],
      "features":["7200RPM, 8MB cache, IDE Ultra ATA-133","NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor"],
      "price":[92.0],
      "popularity":[6],
      "inStock":[true],
      "manufacturedate_dt":"2006-02-13T15:26:37Z",
      "store":["35.0752,-97.032"],
      "_version_":1796378465692286976
    }]
  }
}

■最後に

今回はそもそも Solr とはどんなものか、ということを中心にお話ししてみました。
検索機能を作りたい時に使うのかなぁ、となんとなく伝わったでしょうか?多数のページで構成された、公開するためのサイト……例えばマニュアル・ヘルプだったり、EC などを作る場合には利便性を確保するための選択肢として強力に働いてくれるハズです。

なお、今回の話の中で出てきた RDB や Podman ってのは何なんだ、という方は以下の別記事も見ていただけたら幸いです。

わからないなりに理解したいデータベース①:RDB編:MySQL①
わからないなりに理解したい Podman ① ~ 何をするもの?

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です