10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GroongaAdvent Calendar 2014

Day 25

全文検索エンジンGroongaの2014年の最新情報

Posted at

はじめに

Groonga Advent Calendar 2014最後の記事としてGroongaに関連する2014年の最新情報を紹介します。(1日目でGroongaの特徴を紹介しているので、Groonga?という方はまずはそちらを読んでみてください。)

参加してくれたみなさんありがとうございました!

紹介する情報は大きくグループ化すると次の通りです。

  • 位置情報関連
  • 高速化関連
  • 検索関連
  • 機能関連
  • パッケージ関連
  • プラットフォーム関連
  • インターフェイス関連
  • イベント関連

位置情報関連

geo_in_rectangle()関数が全世界をサポート

指定した矩形内に存在する点を検索するgeo_in_rectangle()関数が全世界の点をサポートしました。以前は北半球の点のみのサポートでした。

きっかけは、去年開催した全文検索エンジンGroongaを囲む夕べ 4でのDeNAの沖津さんのGroongaとMapKitという発表でした。この発表の中でgeo_in_rectangle()関数が北半球しかサポートしていないから別の方法で対応した、という話があったのです。必要なら実装しなくては!ということで次のリリースではgeo_in_rectangle()関数を北半球だけでなく全世界で動くようになりました。

みなさんも困ったことや要望を伝えてみてはいかがでしょうか。Groongaは日本で開発されているので日本語で伝えることができます。みなさんのフィードバックでGroonga本体がよくなっていきます!

高速化関連

between()関数を追加

1 <= column && column <= 10というような範囲クエリーを高速に実行するbetween()関数を追加しました。これはSQLでいうcolumn BETWEEN 1 AND 10に相当します。

実際、Mroonga(MySQLからGroongaを使うためのストレージエンジン。SQLでGroongaを使える)では、column BETWEEN 1 AND 10というクエリーを指定されたら内部的にbetween()関数に置き換えて実行しています。

レコード数やデータの偏り具合にもよりますが、1万レコードで10倍、10万レコードで100倍ほど高速になる場合があります。

参考URLは次の通りです。

in_values()関数を追加

column == 1 || column == 2 || column == 3というような等価条件をORでつなげたクエリーを高速に実行するin_values()関数を追加しました。これはSQLでいうcolumn IN (1, 2, 3)に相当します。

in_values()関数のドキュメントはまだ書かれていません。。。)

range_filterコマンドを追加

範囲検索に特化したselectコマンドのようなrange_filterコマンドを追加しました。ヒット件数の取得やドリルダウンなどはできないのですが、上位N件を取得するといった検索をselectコマンドよりも高速に実行できます。

SQLでいうとORDER BY LIMITを指定することで高速になるケース用のコマンドです。

range_filter()コマンドのドキュメントはまだ書かれていません。。。)

mrubyのクエリーオプティマイザーをサポート

内部の話ですが、クエリーオプティマイザーをmrubyで書けるようになりました。これにより、これまで対応していなかったようなクエリー最適化を実装する基盤ができました。これからのGroongaの高速化に期待してください!

なお、Windows版のGroongaパッケージではmrubyが組み込まれていて、mrubyベースのクエリーオプティマイザーが使われています。

検索関連

レコード毎の重み付けに対応

これまではインデックス毎に検索結果のスコアの重みを指定することができましたが、それに加えてマッチしたレコード毎にも重みを指定することができるようになりました。

レコード毎に重みを指定することができると、特定のレコードを「ピックアップ」する(スコアーを高く)ことができます。例えば、「Groonga」でWebサイト検索をしたとき、「Groongaの公式サイト」に高い重みを指定しておくと、他のWebサイトよりも高いスコアーにできます。

参考URLは次の通りです。

近傍検索記法を追加

もともとselectコマンドのfilterオプションでは近傍検索を指定できたのですが、queryオプションでは指定できませんでした。Groonga 4.0.5からは*N"キーワード1 キーワード2"という記法で指定できるようになりました。

詳細はGroonga 4.0.5のリリースアナウンスを確認してください。

機能関連

データベース(カラム)のファイルサイズ増加を抑制

Groongaは可変長の値を入れるカラム(*)に対して値の削除や更新を繰り返すと、場合によってそのカラムのファイルサイズが大きくなっていくという問題がありました。

(*) ShortTextTextなどの可変長サイズの型を使っているカラムかベクターカラム。ベクターカラムの場合はInt32など固定長サイズの型でも可変長の値になる。

この問題に対して、いくつか対策をしました。Groonga 3.1.2では必要のない更新を避けるという対策が入り、Groonga 4.0.1では更新しても問題を発生しにくくするという対策が入りました。

これらの対策のおかげでほとんどのケースで肥大化は起きなくなっています。詳細は次の記事を参考にしてください。

この対策の有効性についての検証に協力してくれたみなさん、ありがとうございました!

キーワードハイライト関数を追加

キーワードハイライトをするhighlight_html()関数highlight_full()関数を追加しました。

snippet_html()関数でもハイライトできたのですが、文書全体をハイライトする用ではありませんでした。追加したhighlight_html()関数は文書全体をハイライトする機能です。

この機能は@naoa_yさんが開発しました。ありがとうございます!

トークンフィルター機能を追加

実験的な機能扱いですが、トークナイズ後のトークンを処理する機能、トークンフィルター機能を追加しました。トークンフィルターはプラグインとして拡張することができます。

ストップワードを実現するトークンフィルターとステミングを実現するトークンフィルターをバンドルしています。

使い方はGroonga 4.0.7のリリースアナウンスを参考にしてください。

カラム圧縮機能を追加

実験的な機能扱いですが、カラムの値を圧縮する機能を追加しました。カラム圧縮機能を利用するとカラムの読み書き時のCPU使用量が増えます(圧縮・伸張するため)が、I/Oが減ります(ディスクに読み書きするサイズが減るため)。

圧縮アルゴリズムにはzlibとLZ4を使えます。

使い方はGroonga 4.0.7のリリースアナウンスを参考にしてください。

この機能は@naoa_yさんが開発しました。ありがとうございます!

複数のカラムをキーにしたドリルダウンのサポート

selectコマンドでは1つのカラムの値を使ってのドリルダウンしかできませんでしたが、複数のカラムの値を使ってドリルダウンできるようになりました。

実例を見た方がわかりやすいので、気になる方はGroonga 4.0.9のリリースアナウンスGroongaの複数キーのドリルダウンとin_values関数を試してみたを参考にしてください。

管理ツールの刷新

Groongaの細かいことを知らなくても使えるWebブラウザー上で動く管理ツールを開発中です。現在は検索機能だけ動いているのですが、既存の管理ツールよりかなり使いやすくなっています。

パッケージ関連

Ubuntuのパッケージ配布URL変更

これまでは他のプラットフォームと同じように http://packages.groonga.org/ でUbuntuのパッケージも配布していましたが、Launchpadを利用するようにしました。LaunchpadはUbuntu用のパッケージビルド・パッケージ配布機能を提供しているサービスです。

Ubuntuに入っているパッケージ管理ツールはLaunchpadで配布されているパッケージを簡単に使うための機能が入っているのでインストール方法がこれまでよりも簡単になりました。詳細はインストールドキュメントにまとめてありますが、抜粋すると↓だけでGroongaのパッケージをインストールする準備ができるようになりました。

% sudo add-apt-repository -y ppa:groonga/ppa

ConoHa支援プログラムを利用開始

パッケージ配布サーバー( http://packages.groonga.org/ )のためにConoHa支援プログラムを利用することにしました。これまでは既存のサーバーに相乗りしていたのですが、分離したことで管理しやすくなりました。とても助かっています。

ConoHaには他にもイベント開催を協力してもらったりしていて、こちらもとても助かりました。ありがとうございます!

プラットフォーム関連

HerokuでGroonga・Rroonga・Nroongaを利用可能になった

HerokuというPaaSでGroonga・Rroonga・Nroongaを使えるようになりました。Herokuはアプリケーションのコードをgit pushするとデプロイして運用してくれるサービスです。Herokuを利用することでアプリケーション開発者は運用のことはHerokuにお任せしてアプリケーションの開発に集中することができます。

そんなHerokuでGroongaを使えるようになりました。これは全文検索機能が必要なアプリケーションをHerokuの上で動かしやすくなったということです。

使い方は次のURLを参考にしてください。

HerokuでGroongaを使えるようにする仕組みについて気になる方は次のURLを参考にしてください。

なお、Heroku用のGroongaは@ryo_sugryoさんがビルドしてくれています。ありがとうございます!

Webブラウザー上でGroongaを試せるTry Groongaを公開

Herokuの上でGroongaを動かせるようになったので、「Groongaを動かせるWebアプリケーション」をHeroku上で動くようにしました。それがTry Groongaです。

ローカル環境にGroongaをインストールしなくてもGroongaを試せるので、ちょっと挙動を確認したいときやドキュメントに書いているサンプルを動かしたいときに便利です。

デプロイスクリプトが増加

2014年はChefやAnsibleを使ってデプロイするためのスクリプトが続々と公開されました。

インターフェイス関連

HTTPサーバーがPOSTに対応

GroongaはnginxベースのHTTPサーバー機能と独自実装のHTTPサーバー機能を提供しています。独自実装のHTTPサーバー機能は必要最小限の機能しか実装していなかったため、これまでPOSTに対応していませんでした。(nginxベースのHTTPサーバー機能の方では対応していました。)Groonga 4.0.3から独自実装のHTTPサーバー機能でもPOSTに対応したので、大きなデータをloadコマンドで投入することができるようになりました。

GQTPサーバーのデフォルトポート番号を変更

これまでHTTPサーバーもGQTPサーバーもどちらもデフォルトで10041番ポートを利用していましたが、GQTPサーバーはデフォルトで10043番ポートを利用するように変更しました。これは、デフォルトのポート番号が重複していると区別しにくくて使いにくいためです。なお、GQTPサーバーの方のポート番号を変更した理由は、HTTPの方が推奨プロトコルだからです。

イベント関連

今年は「年に1度のいい肉の日の大きなイベント」だけでなく「年に何度も小さなイベント」を実施することで、よりGroongaについて知ってもらおうとしました。

2014年にあったイベントは次の通りです。

まとめ

2014年のGroonga関連情報を紹介しました。気になるものはありましたか?

Groongaプロジェクトはユーザーからのフィードバックを待っています!困ったことや要望などあればメーリングリスト@groongaIssuesやオフラインのイベントなどでぜひ声をきかせてください。

それでは、2015年もGroongaを使ってガンガン検索してください!

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?