隔週連載groonga

第1回全文検索エンジンgroongaを紹介します!

今回から始まった隔週連載groongaでは、groongaを使いたくなるような情報を隔週毎にお届けします。

groongaとはGitHubで公開されているオープンソースの全文検索エンジンです。大量にある文書の中から目的のキーワードを持つ文書を高速に見つけることができます。

groongaのロゴ©groongaプロジェクト
groongaのロゴ

第1回目である今回は、この連載についてとgroongaの特徴を紹介します。

この連載について

まず、この連載について説明します。

この連載は「読者の皆さんがgroongaを使いたくなる!」ことを目指しています。そのために、次の2点の情報を次回から交互にお届けします。

  • groongaの利用事例の紹介
  • 利用事例に関連した役立つ情報の紹介

利用事例を紹介することで、⁠あそこでも使っているなら自分も使ってみようかなぁ」とか「こんな使い方をしているなら自分も使ってみようかなぁ」と思ってもらえることを狙っています。

利用事例の次の回では、その利用事例に関する役立つ情報を紹介します。たとえば、さらにもう一歩進んだ使い方や、別のやり方などの情報を紹介します。利用事例をアレンジして自分の用途になじませて使う時に役立つことを狙っています。

この連載は利用事例が尽きたら終了してしまいます。そのため、連載中もgroongaの利用事例を紹介してくれる人を募集します。⁠この連載を読んでgroongaを使い始めました!」という人が利用事例を紹介してくれるようになれば、胸を張って「この連載は成功だった!」と言えます。ぜひ、⁠いま抱えている問題をgroongaで解決できないか?」という視点で読んでみてください。

groongaについて

連載の最初なので、今回はgroongaについて紹介します。

groongaの読み方

最初にgroongaの読み方を紹介しなくてはいけないでしょう。groongaは「ぐるんが」と読みます。命名者はgroongaを書き始めた森さんです。名前の由来は「強そう」だからとのことです。⁠ぐるんが!」たしかに強そうですね。⁠ジャングルとかにぐるんが族とかいそうじゃない?」という勝手なイメージから、最初のgroongaのロゴは仮面をベースにしていました。

古いgroongaのロゴ©groongaプロジェクト
古いgroongaのロゴ

もうひとつ名前の由来があります。そちらは「Webの検索エンジンで見つけやすい」というものです。すでに広く使われている名前と同じものにすると、Webで検索したときに他の名前の結果に埋もれて見つかりにくくなってしまいます。すると、せっかく興味をもって検索してくれた人に情報が届きません。そのため、当時ほとんど使われていなかったgroongaになりました。

なお、groongaは元々Senna(せな)という名前で開発されていました。これはF1ドライバーのアイルトン・セナに由来しています。しかし、すでに広く使われている名前にちなんでいるため、Webで検索しづらかったのです。

groongaに改名した理由

さて、今後また名前を変えることはあるのか?というのは気になるところですよね。それは、もうなさそうです。

Sennaからgroongaに名前を変えた理由は、より性能を向上させるためにAPIを大きく変えたいからというものでした。つまり、非互換が導入されるため、名前を変えて互換性がないということをわかりやすく表現したのです。

しかしながら、既存のSennaユーザがgroongaに乗り換える敷居も高くなりました。名前を変えることにより、変更前のものとは違うことが伝わりやすくなりましたが、既存のユーザが離れやすくなってしまいました。より新しく、より性能も向上しているのにです。

このような出来事があったため、⁠今後は名前を変更しないでしょう」と森さんも話しています。

groongaの特徴

名前について理解が深まったところで、次にgroongaの特徴を紹介します。具体的には次の4つの特徴を見ていきます。

  • すぐに検索可能な全文検索機能
  • 参照ロックフリー
  • 高速なドリルダウン機能
  • 高速な位置情報検索機能

groongaについてもっと知りたい場合は、groongaのドキュメントを読んでみてください。実際にgroongaを動かしてチュートリアルをやってみると理解が深まります。

すぐに検索可能な全文検索機能

groongaは全文検索エンジンなので、当然、全文検索機能があります。全文検索機能とは検索対象の文書(テキストデータの集まり)から指定したキーワードを含む文書を見つける機能です。Googleでは、検索対象の文書がWebページで、検索ボックスに入力したキーワードが指定したキーワードです。

他の全文検索エンジンと比べて、groongaは情報の鮮度をとても大事にしています。情報の鮮度を大事にするというのは、⁠新しい情報をできるだけすぐに検索可能にする」ということです。

例えば、朝、出かけようとしてお昼の天気が気になったとします。雨が降りそうなら傘を持って出かけたいですからね。このとき、当日に発表された天気予報と1週間前に発表された天気予報では、情報の鮮度が違います。1週間前に発表された天気予報よりも、当日に発表された天気予報のほうがより当たりそうですし、できれば当日に発表された天気予報を参考にしたいですよね。これは、新しい情報のほうが価値が高いため、すぐに検索できると嬉しい例です。

groongaは、新しい情報をすぐに検索できるようにするため、インデックスを動的に更新します。インデックスとは高速に全文検索をするためのデータです。動的にインデックスを更新するとは、このデータを変更して新しい情報を検索対象とすることです。一方、静的にインデックスを更新するとは、1からインデックスを作成するということです。静的にインデックスを更新すると1からインデックスを作成するため、動的にインデックスを更新するよりも新しい情報が検索可能になるまでに時間がかかります。

groongaはインデックスを動的に更新できるため、新しい情報をすぐに検索できる全文検索エンジンです。

参照ロックフリー

groongaは、データを更新しているときでもデータの読込みをブロックしません。つまり、更新処理が参照処理の邪魔をしないということです。これを参照ロックフリーといいます。

参照ロックフリーであれば、全文検索機能を提供しながら随時新しい文書を登録しても、検索機能がストップすることはありません。更新処理時に参照ができなくなると、新しい文書を登録する毎に検索機能がストップしてしまいます。前述のすぐに検索可能な全文検索機能は、この参照ロックフリーという仕組みの上で実現されています。

高速なドリルダウン機能

groongaには、文書の属性値でグループ化する機能があります。この機能はドリルダウンやファセットと呼ばれる機能です。groongaではドリルダウンと呼んでいますが、今後ファセットと呼ぶようになるかもしれません。

ドリルダウン機能は検索結果をさらに絞り込みたいときに便利です。例えば、ブログ記事をキーワードで検索したとします。しかし、キーワードが一般的すぎてまだたくさんの記事がヒットしています。このとき、記事にタグがつけてあると、キーワードだけでなくタグも検索条件に加えることでさらに絞り込むことができます。

さらに、キーワードでヒットした記事のタグをグループ化すると、有効なタグのみを抽出できます。有効なタグとは、ヒットした記事につけられているタグということです。ヒットしなかった記事につけられているタグは含みません。

この「有効なタグのみ」ということが重要です。有効なタグのみを抽出できると、ユーザに「このタグなら絞り込めますよ」ということを伝えることができます。すべてのタグしか使えないと、ユーザには「このタグで絞り込めますよ。ただし、何もヒットしない可能性がありますけど」ということを伝えることになってしまいます。

groongaはこのドリルダウン機能を高速に実行できます。これは、groongaが文書の属性値毎に局所化してデータを格納しているからです。属性値が局所化してあることで、キャッシュミスが起きにくくなり、高速にデータにアクセスできます。ドリルダウン機能は文書の属性値に集中的にアクセスする処理が必要になるため、この特性がドリルダウン機能の高速化に効いています。

なお、groongaは文書の属性を保存する場所をカラムと呼んでいます。カラムの値を局所化して格納することをカラム指向や列指向といいます。多くのRDBMSはカラム指向ではなく行指向のデータの格納方法です。つまり、カラム毎にデータを局所化するのではなく、レコード毎にデータを局所化して格納しています。

高速な位置情報検索機能

groongaは全文検索エンジンでありながら位置情報検索もできます。位置情報検索では、⁠今いる場所から半径何メートル以内にあるコンビニ」というような検索ができます。GPS付きのモバイル端末が当たり前になった現在ではとても有用な機能です。

groongaの位置情報検索機能は全文検索機能でも使っているインデックスの仕組みを使います。そのため、高速な全文検索機能を実現するためにチューニングしてきた成果を位置情報検索機能でも使うことができ、高速な位置情報検索機能を実現しています。

次回以降に始まる事例紹介の中には、位置情報検索機能を使った事例もあるので楽しみにしてください。

関連プロダクト

groongaの特徴をなんとなくつかめたところで、関連プロダクトを紹介します。

groongaはHTTPでアクセスする全文検索サーバーとして使えますが、それ以外にもライブラリとして使うこともできます。ライブラリとして使うと、既存のシステムと組み合わせて使うことができます。

groongaとMySQLを組み合わせた使い方をしているのがmroonga(むるんが)です。

mroongaのロゴ©groongaプロジェクト
mroongaのロゴ

mroongaを使うと、HTTPではなくSQLでgroongaの全文検索機能を使うことができます。レプリケーションなどMySQLの管理機能をそのまま使えて便利です。

また、groongaとRubyを組み合わせた使い方をしているのがrroonga(るるんが)です。

rroongaのロゴ©groongaプロジェクト
rroongaのロゴ

rroongaを使うと、Rubyで簡単に全文検索機能を実現できます。事例紹介ではrroongaを使った事例もあるので楽しみにしてください。

リリースサイクル

最後にgroongaのリリースサイクルにも触れておきましょう。groongaは毎月29日「肉の日」にリリースされています。これは、多くのオープンソースソフトウェアに比べて頻繁なリリースです。

どうして毎月リリースするのかというと、より頻繁に成果をユーザの手に届け、フィードバックを得たいからです。具体的には、次のカレンダーで青い丸がついている日にgroongaをリリースしています。

groongaのリリースカレンダー(図のカレンダーは2013年のもの)
groongaのリリースカレンダー

しかし、毎月リリースされていると、⁠そんなに頻繁にアップデートするのは面倒」という気持ちになるかもしれません。その場合は、リリースノートを確認して、アップデートが必要そうだと思った時にアップデートすれば十分です。

それでは、バグを踏んでしまった場合はどうでしょうか。groongaも他のソフトウェア同様バグがあります。開発チームに報告された多くのバグは数日以内に修正されます。他のソフトウェアであれば、その後、バグが修正されたバージョンが早く出ないかなぁと待ち望むことになります。一方、groongaの場合は毎月リリースされるため、遅くとも1ヶ月以内にはバグが修正されたバージョンがリリースされます。これなら、バグを踏んでしまっても、⁠手元で回避して見なかったことにする」ではなく、⁠報告して修正してもらおう!」という気になりませんか?そうなるとうれしいです。

ところで、この連載がどうして「隔週連載groonga」という名前かわかったような気がしませんか?groongaプロジェクトは定期的に着実に進めていくことを大事にしています。この連載でも定期的に読者に有用な情報を提供していきたいと思います。

まとめ

連載の第1回目ということで、この連載の目的と連載の進み方、そしてgroongaそのものについて説明しました。次回はgoongaの利用事例を取り上げます。

おすすめ記事

記事・ニュース一覧