Rabbit Slide Show

Groongaの紹介と事例紹介

Description

Groongaの紹介と事例紹介 全文検索エンジンGroongaユーザ勉強会@神戸

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

Other slides