年に1度のいい肉の日(11月29日)にGroonga(ぐるんが)とその関連プロダクトのイベントとして「Groonga Meatup」が開催されました。
Groongaは、未来検索ブラジルで開発されているオープンソースの全文検索エンジンです。高速であることや、カラムストア機能が付いていることなど、多くの特徴があります。
このイベントは毎年のいい肉の日の恒例行事となっていて、今回で6回目です。昨年までは「全文検索エンジンGroongaを囲む夕べ」と呼んでいましたが、今年はイベント名が変わりました。もともとは平日の夕方から始めていたイベントだったので「夕べ」という名前だったのですが、最近は休日の昼から始めることも多いので、変わったのでしょう。なお、「Meatup」は誤字ではありません。肉(meat)と集まり(meetup)を掛けたものです。いい名前ですね。
イベント告知ページにもあるように、このイベントの醍醐味は次のとおりです。
- Groonga開発チームから今年のアップデート内容と今後の展望を聞ける
- Groongaユーザ間で情報交換できる
イベント終了後には懇親会もあるのでそこで発表者に詳しい話を聞くこともできます。
テーマ
今年のテーマは「よいところ」です。Groongaにはいろいろな使い方があるので、使い方によってよいところは様々です。それを開発者やユーザ間で共有し、今まで知らなかったことを発見してもらい、より一層GroongaやGroonga関連プロダクトを便利に使ってほしい、という思いが込められていたようです。
それでは、今回のイベントを順番に紹介します。
会場・受付
今年は古くからのGroongaユーザでもある、株式会社ぐるなびに会場を提供いただきました。
会場の後ろのほうにはイベントロゴを印刷したTシャツが展示されていました。これはTMIXもスポンサーとなってくれたことで、実現にこぎつけたそうです。このTシャツはイベント終了後の懇親会で争奪戦となりました。
これまでもGroonga族ステッカーの配布はありましたが、Tシャツはなかったのでレアものです。残念ながらTシャツの争奪戦に破れてしまった人でも、Tシャツについて記事でTMIXへの入稿データが公開されています。どうしてもほしい人は自分で作ってみてください。
受付後は参加者に名札が配られました。名札には好きなプロダクトのシールを貼れるようになっていました。また、座席も主に使っているプロダクトごとに分かれていました。Groongaには、MySQLから使えるMroonga(むるんが)、Rubyから使えるRroonga(るるんが)などたくさんの亜種があります。そのため、参加者同士がどのプロダクトを使っているのか知りやすくすることで、話しかけやすくなるようにとの配慮でした。
第1部:今年1年のアップデートと今後の展望を紹介
第1部は、Groonga開発チームからの発表です。
Groonga族2015(須藤功平さん)
クリアコードの須藤さん(@ktou)の発表です[発表資料]。内容は、Groonga族の概要と最新情報についてです。須藤さんはGroongaのメンテナで、他にもたくさんのGroonga関連プロダクトを開発しています。
「Groonga族」は総称で、Groongaそのものと、Groongaと他のプロダクトをつなぐプロダクトの両方を指しています。名前が「〇〇roonga」となっているのが特徴です。
例えば、MySQLとGroongaをつなぐMroonga、RubyとGroongaをつなぐRroongaなどがあります。GroongaはC言語で書かれていて、ライブラリとして他のプロダクトに埋め込めるのがポイントです。
今年は新たにPostgreSQLとGroongaをつなぐプロダクト「PGroonga(ぴーじーるんが)」が加わりました。特徴は、全文検索の知識がなくてもSQL経由で簡単に使えることや、日本語に対応していることがあります。これらはMroongaの特徴でもありますね。さらにPGroongaはトランザクションやユーザ管理、クライアントライブラリといったPostgreSQLの機能を使うことができる点も特徴として挙げていました。
他にもたくさんのいいところや最新情報を紹介していたので、興味のある方はぜひ発表資料をご覧ください。日本語で開発者に直接質問できるのもGroongaのよいところなので、ぜひメーリングリストなども活用してみてください。
Turbo Selector(grn_ts)の紹介(矢田晋さん)
未来検索ブラジルの矢田さん(@s5yata)の発表です[発表資料]。
grn_ts
は「ぐるんたす」と読みます。名前の_ts
はTurbo Selectorからきているそうです。
これまで次期GroongaとされてきたGrnxx(こちらも「ぐるんたす」と読みます)というのは旧プロジェクトであるとのこと。Grnxxを開発していくうちに、Groongaを代替することができないことがわかったので、Grnxxから使える部分を取り出して現行のGroongaに取り込む方針になったそうです。この抽出されたモジュールがgrn_ts
です。
検索用のモジュールとして実装されているため、ユーザはとくに意識することなく使えるのがポイントなのだとか。
データベースへの変更はないので、既存のデータベースを作りなおしたりする必要はないそうです。使い勝手はそのままで、一部の検索クエリを高速化できるというのはユーザにとって嬉しいですね。
selectコマンドのフィルタ(filter)の先頭に「?」をいれるとgrn_tsを使った検索ができるようになっているそうです。まだ、引数にいくつか制限があるなど、実装については試行錯誤している段階とのこと。
とはいえ、いくつかのベンチマークでは従来に比べて10倍速いという結果が得られたと言います。今後は全文検索やドリルダウンをサポートしたいとのことでした。
会場からは、そんなに速くなったのは何故なのか、という質問があり、矢田さんは「既存のGroongaでは、最適化が十分に効いていないケースがあったため」と答えていました。
第2部:Groonga/Mroonga/PGroonga/Rroonga/...のよいところを紹介
第2部は、ユーザさんからの発表です。イベントページの発表者公募要項に『Groonga関連プロダクトを使っていて、「自分」がよいと思っていることを発表してください』とあるとおり、様々な発表がありました。
Mroongaをとある教育サービスで導入してみた話(@sasata299さん)
書籍『Webエンジニアの教科書』も出版している、からあげエンジニアの@sasata299さんの発表です[発表資料]。
それほど詳しくないけど、Classiという教育サービスでコンテンツの検索にMroongaを導入してみたとのことです。
Mroongaのよいところについては次の点を挙げました。
- MySQLだけで全文検索できる。最近のMySQLでもできるけど、わかち書きとか前処理が面倒。
- MySQLなのでわかりやすい。慣れている人も多いので運用が楽。
導入してみてはまったところについては、次の点を挙げました。
- AND検索をどうやっていいかわからない
*D+
というプラグマを使えば複数のキーワードであってもAND検索できるというのは、最初にひっかかるところなのかもしれません。MySQLは伝統的にOR検索なので+foo bar
というクエリはOR検索として扱われてしまいます。AND検索の場合+foo +bar
と記述しないといけませんが、それだと面倒なので、デフォルトで+にするための*D+
というプラグマが用意されているようです。
- CIの環境構築でしばしばコケる
-
CircleCIでCI環境を構築している場合、アップグレードのときなどにインストールでコケるという問題です。Mroongaはプラグインとして実装されていて、なおかつ特定のバージョンでのみ動作するようなパッケージのつくりになっているため、新しいMySQLのパッケージがリリースされると、Mroongaとのバージョンの不一致でインストールできないことがあります。
発表ではMySQLのバージョンを明示してapt-get install
するというテクニックを紹介していました。yumなどでも同じようなことはできるので覚えておくと便利そうですね。
Rubyでプラグインを作れる分散全文検索エンジンDroonga(北市真さん)
EPUB Searcherのメンテナである北市真さん(@KitaitiMakoto)の発表です[発表資料]。
EPUB Searcherは、Droonga(どぅるんが)を使ってEPUBファイルを検索できるWebアプリケーションです。発表では、Droongaのよいところを中心に話がありました。
まず、Droongaについて簡単に説明しました。DroongaはGroongaに分散機能を追加したものです。クライアントとはHTTPで通信するようになっていて、そのままAPIとして公開することもできます。
分散機能はDroongaのよいところの一つです。分散機能の一つであるレプリケーションを使えば、同時接続数が増えたり、一部のサーバに障害が起こったりしても大丈夫といった利点があるようです (レプリケーションについて詳しく知りたい方は、他の記事を参照してみてください)。
Droongaのもう一つのよいところとして、Rubyでプラグインが書ける点を挙げました。Groongaのプラグインは基本的にC言語で書かれています。最近はmrubyでもプラグインを書けるようになりましたが、mrubyは素のRubyに比べるとできることが限られています。その点、Droongaは素のRubyでプラグインを書けるため、機能を追加しやすいです。
さらに、Droongaのプラグインを書く利点として、クライアントの変更に強いことを挙げました。ある機能をクライアント側で実装してしまうと、クライアントを変えたときにその機能を再実装する必要があります。Droongaのプラグインとして機能を実装することで、クライアントが変わってもその機能を使い続けられるのも利点の一つとのことでした。
なお、この発表では、StoboというWebブラウザベースのプレゼンテーションツールが使われました。Stoboには閲覧用URLを使った画面共有機能があります。誰かが画面をダブルクリックすると全員の画面にサムズアップマークが表示される演出があり、会場はたびたび盛り上がっていました。
MroongaとownCloudの良い関係(@ukitiyanさん)
@ukitiyanさんは「MroongaとownCloudの良い関係」と題してMroongaのよいところについて発表しました[発表資料]。@ukitiyanさんはownCloud.jpの中の人です。
最初にownCloudとはどういうものかという説明がありました。ownCloudは専用オンラインストレージを構築するためのオープンソースのパッケージソフトウェアだそうです。オンラインストレージというとDropboxを思い浮かべる人も多いかもしれませんね。
アップロードした文書を簡単に検索したいという需要があり、当初はSolrを想定していましたが、導入コストの問題から代替ソフトウェアを探したのがMroongaを使うようになるきっかけだったとのこと。
ownCloudのプラグインとしてsearch_luceneというのがすでにあったが、日本語検索できないことから採用を断念したそうです。
アップロードしたときのテキスト抽出はApache Tikaで実施してMroongaへと取り込み、全文検索を簡単に実現しています。
実際に、保険会社のコールセンターでownCloudにアップロードした応対資料(Excel)の検索に使われているそうです。追加の要望としてスニペット表示が必要になりましたが、Mroongaのスニペット機能を活用することで、ownCloudはフロントに注力できたと話していました。
WindowsでGroongaを使ったときの事例の紹介(村山さん)
村山さんはWindowsでGroongaを使う事例を発表しました。詳細については非公開でお願いしますとのことなので、このレポートでは紹介できないのが残念です。GroongaをWindowsでも安心して使えますよというのが印象に残る発表内容でした。
Groongaでのタグ検索と表記揺れとの戦い(村上直也さん)
村上さん(@naoa_y)はGroongaのコアな部分に対してGitHubやブログなどで情報発信をしています。
発表では、次の事柄に対して、Groongaのタグ検索を活用していることを紹介しました[発表資料]。
- 特許商標書誌事項の検索
- 特許商標のグループ/クロス集計
規模感については、それぞれ1000万レコードくらいのものを運用しているそうです。
Groongaのよいところとして、カラム指向かつ参照型が使えるため、ファセット検索(ドリルダウン)が高速であること、ベクターカラムでも高速な検索ができるのが嬉しいとのことでした。
参照型なので、付属するメタデータも一緒に一つのクエリで取得できるのもよいところだと挙げていました。
ただ、タグ検索でありがちなこととして表記揺れが多いとのことでした。ローマ字表記が特に顕著なのだそうです。表記揺れの具体例を「株式会社」で紹介していました。
- KABUSHIKI KAISYA
- KABUSHIKI KAISHA
- KABUSHIKI GAISHA
こういうケースにも負けない検索をしたいということで、groonga-term-similarという表記揺れを抽出するプラグインを開発したとのことです。
このプラグインでは、次のような工夫をしたそうです。
- Patricia Trieで前方一致検索を使って類似度の計算量を削減
- 編集距離(Damerau-Levenshtein distance)と組み合わせる
- qwerty配置のキーボード距離も考慮する
- DF(Document frequency)が高いものを選ぶようにする
これらの工夫によりおおむね正しい単語を抽出できるようになったことを示していました。
表記揺れは、グループ集計などで問題になるため、groonga-tag-synonymというタグの同義語変換などに利用できるプラグインも開発されたそうです。
Groongaのよいところとして、「C/C++で開発できる」「mrubyでもプラグインを開発できる」という点を挙げ、今後はあいまい検索もしてみたいとのことでした。
Droongaを転職情報サイトで使ってみた話(瀬戸隆太さん)
ジャストシステムの瀬戸さんは、求人サイトピタジョブで使っているDroongaについて発表しました。
レコメンド(類似文書検索)やサジェスト(補完)など、全文検索以外の機能でも活用できることや、Rroonga(Ruby)で機能拡張できるため柔軟な検索機能を実現できることなどがDroongaのよいところとして紹介しました。
また、ジャストシステムの日本語解析エンジンJMATを使うためのプラグインがあることも、Groongaのよいところとして挙げていました。JMATについてはこちらのスライドで紹介されています。
Groonga導入事例(佐藤博之さん)
佐藤さん(@hiroysato)は、Groonga導入事例を発表しました[発表資料]。
主に次の3点について話しました。
- Groongaを選んだ理由
- Embulk用プラグイン
- 開発者に相談したら50倍以上速くなったこと
まず、構築するサービスの全文検索ソフトウェアにGroongaを選んだ理由について、「日本語対応」と「信頼できるメンテナ」の2点を挙げて説明しました。「日本語対応」については、Groonga単体で全角英字や半角英字を正規化(統一して扱う)ができたのがポイントだったそうです。「信頼できるメンテナ」については、Groongaのメンテナの一人である須藤さんがメンテナンスしているソフトウェア(ActiveLdapやrcairo)を使って、してみたいことを実現できていたことが決め手だったようです。
次に、システム構成について紹介しました。サーバではオープンソースバルクローダであるEmbulkを使用していて、そこからGroongaにデータを登録する構成になっています。そこで、佐藤さんはEmbulkからGroongaにデータを登録するプラグインを自作しました。オープンソースとして公開しているので、興味があればTwitterなどで声をかけてほしいとのことでした。
Groongaの導入後、なぜか遅い部分に気づいて Groongaプロジェクトに不具合報告をしたそうです。それを受けて須藤さんが50倍以上速くしてくれたことがあったことを取り上げ、須藤さんをはじめとした開発者に感謝の気持ちを伝えていました。
GroongaアプリケーションをDockerコンテナ化して配布する
おんがえしさん(@ongaeshi)の発表です[発表資料]。おんがえしさんはMilkodeという行指向のソースコード検索エンジンと検索アプリの作者でもあります。MilkodeはRroongaを使って実現しています。
この発表では、Honyomiという電子書籍検索エンジンと検索アプリの紹介、その配布について取り上げました。
タイトルにあるDockerコンテナ化のきっかけについては次のように経緯を話しました。
Honyomiを配布したけれどもインストールに失敗する人が多いというのが、問題になりました。それは、つまずきやすいポイントがHonyomiではネイティブgem(C言語で書かれている部分があり、インストール時にビルドしなければいけない)をインストールする必要がある点です。そこで、Dockerコンテナ化して解決すればいいのではと思い至ったそうです。
Dockerコンテナを利用するにあたっては、DockerをGUI経由で簡単に使えるKitematicがあることが決め手になったようでした。
実際のコンテナ化にあたっては、Rroongaの公式Dockerコンテナを先に用意して、それを継承したHonyomiのコンテナを作ったそうです。そうすることで、Honyomiに限らず、Rroongaを利用したアプリケーション開発者もそのコンテナを使えます。
よいところとして、公式Dockerコンテナを使って簡単にアプリケーションをデプロイできる点をアピールしていました。
会場では、MroongaのDockerコンテナを公開していることも紹介していました。
懇親会
イベントの後、懇親会が行われました。飲食物は会場を提供していただいた、ぐるなびに提供していただきました。いい肉の日ということで、今年も肉料理がメインでした。
懇親会では冒頭でも触れた、Tシャツ争奪戦が行われました。希望者が多かったため、Groongaのよいところをアピールして拍手で判定するというスタイルで、大いに盛り上がっていました。
懇親会終了後は有志で二次会も行われました。私も参加したのですが、ぐるなびで選ばれただけあってすばらしいお店で、話がはずみました。
おわりに
Groongaはいろいろな使い方があるため、参加者も様々な分野から集まっています。発表だけでなく、休憩時間や懇親会での会話でGroongaの新たな「よいところ」が見つかった方も多かったようです。
私が印象に残ったのは、古くからあるMroongaが相変わらず話題に挙げっていることでした。毎年のように複数のユーザが発表で取り上げていて、安定して使われていることがわかります。今年はMroongaプロジェクト公式のDockerイメージが公開されるなど、特に運用面で進歩しているようです。
Mroongaによく似たプロダクトとして、今年公開されたPGroongaがあります。今まではMroongaによってMySQLとGroongaが一緒に使われる場面が多かったのですが、今後はPGroongaによってPostgreSQLとGroongaが一緒に使われる場面が増えてくるのかもしれません。
来年の2月9日にはMySQLとPostgreSQLと日本語全文検索というイベントが企画されているので、気になる方はチェックしてみてください。
また、来年もいい肉の日である11月29日にGroongaのイベントが開かれる予定です。次の1年間はどんな成果が見られるのか、楽しみですね。