Text
Page: 1
Groongaの紹介
事例紹介
Naoya (@naoa̲y)
全⽂検索エンジンGroonga勉強会@神⼾
2014/06/27
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 2
今⽇の流れ
✓ みんなで自⼰紹介
✓ Groongaについて紹介
✓ 事例紹介
✓ Groongaの今後への期待
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 3
自⼰紹介
✓ Naoya (@naoa̲y)
✓ 大学は情報系
✓ 新卒で3年半ほど⾦融系のユーザSI
でインフラSE
✓ 現在は3年半ほどITと無縁の仕事
✓ Groonga/Mroonga暦は2年ちょっ
と
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 4
今⽇の流れ
✓ みんなで自⼰紹介
✓ Groongaについて紹介
✓ 事例紹介
✓ Groongaの今後への期待
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 5
今⽇の流れ
✓ できるだけ具体的なコマンド等
を⾒せていきます
✓ せっかく⼩規模なので途中で遮
ってもいいのでどんどん質問し
てください。
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 6
Groonga族の概要
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 7
Groonga
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 8
Groongaって?
✓ C⾔語で書かれた超⾼速な
全⽂検索ライブラリ/サーバ
✓ カラム指向のデータストア
✓ ⾼速な集計処理
✓ 即時更新
✓ 新鮮な情報をすぐに検索可能に
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 9
Groongaって?
✓ 専用のRDBほど複雑な表現は
難しいがほぼRDBに近いイメ
ージでテーブル設計ができる
✓ 転置索引を使った⾼速全⽂検索
✓ ⽂字列をトークンに分割し、トーク
ンが⼀致する⽂書IDを検索すること
により大幅に演算量を減らす
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 10
Groongaの全⽂検索の流れ
✓ ⼊⼒⽂を正規化
✓ 例:This is a pen. → this is a
pen.
✓ ⼊⼒⽂をトークンに分割
✓ 例:今⽇は⾬ → 今⽇/は/⾬
✓ 転置索引を更新/検索
✓ 分割したトークンとトークンの⽂書
IDと⽂書IDにおける出現位置情報を
記憶/検索
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 11
Groongaの全⽂検索の流れ
✓ Groongaではライブラリとし
て利用してもこれらの作業を勝
⼿にやってくれる
✓ たぶんApache Luceneはひと
つひとつやらないといけない
(たぶん)
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 12
Groonga CLI
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 13
Groonga CLI
✓ CLI コマンドラインインターフ
ェース
✓ 対話的にちょっとしたデータを確認
したいときやクエリの組み⽴てに便
利
✓ 最近のNoSQL系はほとんどJSONイ
ンターフェース
✓ 息を吐くようにスクリプトでJSON
かける⼈なら無くてもいいだろうけ
ど、そうではないのでCLIがあるの
は凄い便利
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 14
Groonga HTTP
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 15
Groonga HTTP
✓ GroongaのHTTPはnginx組み
込みと独自実装の2つ
✓ nginxの豊富な機能を使う場合
はgroonga-httpd
✓ 単純に使うだけならgroonga
コマンドをhttpモードで起動
✓ サービスとして導⼊したい場合は
groonga-server-httpをインストー
ル
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 16
Groonga GQTP
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 17
Groonga GQTP
✓ コマンドと同じようにしてリモ
ートのサーバと直接会話できる
✓ groongaコマンドをgqtpモー
ド起動
✓ サービスとして導⼊したい場合は
groonga-server-gqtpをインスト
ール
✓ 今後非推奨になる
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 18
Groongaライブラリ
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 19
Groongaライブラリ
✓ サーバを⽴てずにGroongaを
組み込んでアプリを作る場合は
これ
✓ 結構難しい。が、コマンドを直
接投げたり受けたりするモード
があるのでそれを使うだけなら
簡単
✓ 難しいことしないならLucene
よりはるかに簡単?かも
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 20
C⾔語でのクエリAPI
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 21
Mroonga
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 22
Mroongaって?
✓ Groongaをライブラリとして
利用して全⽂検索機能が組み込
まれたMySQLのストレージエ
ンジン
✓ SQLで簡単に全⽂検索が可能
✓ MariaDBにもバンドル予
定 ?
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 23
Mroongaって?
✓ SQLでGroongaのコマンドよ
りも柔軟なデータ操作ができる
✓ ※全⽂検索以外はMySQLの層でデ
ータ操作するので同じ操作でも
Groongaよりも遅くなることも
✓ 関数やツールなどMySQLの豊
富な資産が利用できる
✓ phpMyAdmin、レプリケーショ
ン、バックアップ etc
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 24
Rroonga
コマンド
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 25
Rroongaって?
✓ Rubyらしい記法でGroongaラ
イブラリを利用できる
✓ gemで⼀発インストール
✓ ※Windows以外は数⼗分必要
✓ RubyとGroongaが動けば使え
る
✓ クロスプラットフォーム(Win/
Linux/Mac)
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 26
Rroongaって?
✓ ライブラリとして利用できるの
で他にサーバが不要(≒SQLite)
✓ Rubyなのでメモリ管理や⽂字
列操作、データの操作が抜群に
楽
✓ データベースAPIレベルが使え
るので組み込みコマンド以上の
複雑な操作をRubyで実現可能
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 27
どれを使うべき?
✓ サーバ経由でGroongaを使っ
て⾼速な全⽂検索をしたい
✓ Groonga HTTP/GQTP Mroonga
✓ 既存のMySQLのツールや複雑
なSQLを扱いたい(速度差に注
意)
✓ Mroonga
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 28
どれを使うべき?
✓ Rubyで全⽂検索アプリケーシ
ョンを作りたい
✓ Rroonga
✓ 他の⾔語で全⽂検索アプリケー
ションを作りたい
✓ Groonga GObject
http://qiita.com/groonga/
items/71b145b37d77bd160bf2
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 29
どれを使うべき?
✓ サーバ経由もしくはクライアン
トでGroongaの⼒を100%使
いたい
✓ Groonga
✓ 超大規模なデータベースで全⽂
検索したい
✓ Droonga、Mroonga & Spider
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 30
Groongaってどのくらい速
い?
✓ 検索性能は⽂書やトークナイズ
の仕⽅にかなり左右される
✓ ⽇本語の⽂書でBigram(2⽂字
ごと)なら数⼗GiB超でも余裕
✓ ⽇本語の⽂書でTrigram(3⽂字
ごと)なら100GiB超でも余裕
✓ MeCabは単語間の検索性能に
偏りが出やすい
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 31
Groongaってどのくらい速
い?
✓ 英語のみの⽂書でBigramにす
ると10GiB、20GiBでかなり苦
しい
✓ 英語の⽂書をNgramにするな
らTokenTrigramのSplitBy系
が欲しいところ
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 32
Groongaの拡張性
✓ 以下をC⾔語のプラグインで拡
張することができる
✓ トークナイザ
✓ ノーマライザ
✓ コマンド
✓ 関数
✓ ただし情報は少なくC⾔語なの
で単なる⽂字列操作も大変
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 33
Groongaの紹介
✓ 終わり
✓ 質問があれば受け付ける
✓ ここで休憩 & 雑談
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 34
今⽇の流れ
✓ みんなで自⼰紹介
✓ Groongaについて紹介
✓ 事例紹介
✓ Groongaの今後への期待
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 35
事例紹介
✓ 特許の全⽂検索サービスを個⼈
で作りました。
✓ http://patentfield.com
✓ まだデザイン⾯とか使い⽅とか⼒を
いれてないのでその辺は気にしない
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 36
現状の公的サービス
✓ 700万件以上蓄積されているの
に1000件以下に絞り込まない
と表⽰できない
✓ ソートできない、検索結果から
絞込みできない
✓ 検索結果で番号とタイトルと出
願⼈以外表⽰できない
✓ DBがいくつも分かれていて検
索対象にできない項目が多数
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 37
システム概要
✓ 最大で1000万件、データサイ
ズ400GiB超 トータルで1.5TB
ぐらい
✓ カラム数は100ぐらい
✓ Mroongaを利用
✓ 複雑な絞込みやドリルダウンを
使いたいため全⽂検索は
Groongaを利用
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 38
全⽂検索時
コマンド
Groongaの紹介事例紹介
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Powered by Rabbit 2.1.2
Page: 39
更新・メンテナンス時
コマンド
Groongaの紹介事例紹介
クエリー⾔語
データベース機能
キー管理 転置索引 データストア
Powered by Rabbit 2.1.2
Page: 40
Groongaで使った機能
✓ 全⽂検索
✓ 重み付け
✓ ドリルダウン
✓ サジェスト
✓ 近傍検索
✓ 類似検索
✓ スニペット
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 41
トークナイザによる検索性能
差
✓ 400GiBのデータベースを標準
のTokenBigramすると検索速
度がかなり劣化
✓ TokenMecabを採用 しかし、
Mecabでは助詞等の頻出用語
を含むと性能が顕著に劣化
✓ トークナイザプラグインで頻出
用語を除去することで回避
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 42
英語の複数形・過去形の取扱
✓ 英語でTokenBigramを使うと
単語ごとにトークナイズされる
✓ これでは複数形や過去形を検索
できない
✓ トークナイザプラグインでステ
ミングを追加することで回避
✓ ⼀定のルールで複数形や過去形っぽ
い末尾を削除してくれる
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 43
ノーマライザのカスタマイズ
✓ カタカナの⼩⽂字、大⽂字の扱
いがばらばら
✓ 例:フィルム⇔フイルム
✓ 古いデータでは⻑⾳記号がハイ
フンだったり
✓ 例:データベース⇔デ-タベ-ス
✓ ノーマライザプラグインでこれ
らを同⼀視
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 44
大量レコードのドリルダウン
による性能劣化
✓ 全⽂検索結果で大量にレコード
があるとドリルダウンはコスト
が⾼い
✓ 100万件以上はドリルダウンしない
ように組み込みselectコマンドをい
じる
✓ C⾔語やRroongaでDB-APIを使う
ことでも解消可能
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 45
複数カラム絞込みスニペット
✓ Groonga組み込みの
snipet̲html関数はカラムを指
定するだけで便利
✓ しかし、対象のカラム以外の検
索クエリも対象としてしまう
✓ ノーマライザの指定ができない
✓ Mroongaと同等のスニペット
関数プラグインで作る
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 46
感想
✓ 400GiB超のデータベースが1
台でさばけるとは思わなかった
✓ このサイズを1台で⾼速に検索
できるというのはすごく夢が広
がる
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 47
感想
✓ 個⼈や少⼈数でも少し昔では考
えられなかった規模の全⽂検索
システムを作ることができる
✓ メーリングリストが親切なので
プログラミング経験がほとんど
なくても作れた
✓ 今後はRubyで全⽂検索デスク
トップアプリを作りたい!
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 48
事例紹介
✓ 終わり
✓ 質問があれば受け付ける
✓ ここで休憩 & 雑談
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2
Page: 49
お疲れ様
でした
Groongaの紹介事例紹介
Powered by Rabbit 2.1.2