groonga族 2015
TRANSCRIPT
![Page 1: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/1.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族2015
須藤功平 株式会社クリアコード
Groonga Meatup 20152015-11-29
![Page 2: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/2.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
内容
Groonga族の概要
Groonga族の最新情報
Groonga族の今後の情報
![Page 3: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/3.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族
総称
![Page 4: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/4.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族
Groongaそのもの
Groongaと他のプロダクトをつなぐプロダクト
名前がXroonga
![Page 5: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/5.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
つなぐプロダクト
MySQL
ライブラリー
RubyAPI
PostgreSQL 他のプロダクト
つなぐプロダクト
Groonga
SQL SQL
ポイントGroongaはライブラリーとして他のプロダクトに埋め込める!
![Page 6: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/6.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Groonga
ぐるんが
![Page 7: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/7.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ1
高速な全文検索機能
(全文検索エンジンなので当然)
![Page 8: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/8.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ2
即時更新
![Page 9: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/9.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
即時更新
更新→すぐに検索可能思想:新鮮なデータは高価値
新しいデータはすぐに入れて!
工夫:更新中も検索性能キープ即時データ投入を妨げる理由を減少
実装:参照ロックフリー
![Page 10: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/10.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
性能の傾向検索スループット
更新スループット
Groonga
検索スループット
更新スループット
更新中は参照不可の
エンジン
更新が増えても
検索性能は落ちない
更新が増えると
検索性能が落ちる
![Page 11: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/11.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ3
高速な集計処理
![Page 12: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/12.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
高速な集計処理
集計処理同一カラムの値を一気にアクセス
工夫:↑向けデータ構造を採用高速な集計処理を実現
実装:カラムストア
![Page 13: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/13.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
カラムストア
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Groonga
カラム毎
RDBMSなど
カラム 行
値の管理 行毎
得意なアクセス単位
![Page 14: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/14.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ3
手厚い日本語サポート
![Page 15: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/15.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
サポート例:RKサーチ
ローマ字でカナを検索Romaji to Kana prefix search
例:「ya」→「ヤキニク」「や」・「ヤ」→「ヤキニク」も可
用意するものカタカナでのヨミガナだけ(ひらがな・ローマ字はいらない)(ローマ字の訓令式・ヘボン式の差はGroongaが吸収)
![Page 16: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/16.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
RKサーチの利用例1
入力補助
例:タグの入力同じことに違うタグをつけると検索精度があがらない全体で一貫性があることは重要既存のタグを入力補助することで同じことに同じタグをつけやすくする
使い所:妥当な値の集合があるタグ入力なら既存タグ
![Page 17: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/17.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
RKサーチの利用例2
検索ボックスでの補完
Googleもやっているやつ
ぐるなびはGroongaで実現
![Page 18: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/18.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ぐるなびでの利用例
「yu」→「ユウラクチョウ」→「有楽町」
出典:Groongaのサジェストで四苦八苦 by Walkerhttps://speakerdeck.com/redfigure/groongafalsesaziesutodesi-ku-ba-ku
![Page 19: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/19.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方1
スキーマ作成
% groonga-suggest-create-dataset \ DB_PATH stations
![Page 20: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/20.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方2
データ準備
[ { "_key": "有楽町", "kana": ["ユウラクチョウ"], "boost": 100 }]
boostを100以上にすること
![Page 21: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/21.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方3
データロード
% curl \ 'localhost:10041/d/load?table=item_stations' \ --header 'Content-Type: application/json' \ --data-binary @stations.json
curlを使うときは--dataではなく--data-binaryを使うこと--dataは改行を削除するため
![Page 22: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/22.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方4
補完
% curl \ 'localhost:10041/d/suggest' \ --get \ --data-urlencode 'types=complete' \ --data-urlencode 'table=item_stations' \ --data-urlencode 'column=kana' \ --data-urlencode 'query=yu'[ [...], {"complete": [[1],[...],["有楽町",101]]}]
![Page 23: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/23.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ4
組み込める
![Page 24: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/24.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
組み込める
ライブラリーとして利用可能=インターフェイスを変えられる
=使いやすい方法で使える
![Page 25: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/25.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
つなぐプロダクト
MySQL
ライブラリー
RubyAPI
PostgreSQL 他のプロダクト
つなぐプロダクト
Groonga
SQL SQL
ポイントGroongaはライブラリーとして他のプロダクトに埋め込める!
![Page 26: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/26.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Mroonga
むるんがMySQL + Groonga
![Page 27: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/27.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ1
簡単に使える
![Page 28: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/28.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
簡単
SQLで使える
全文検索の知識なしで使い始められる
![Page 29: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/29.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaを使う:スキーマ
CREATE TABLE texts ( content TEXT, FULLTEXT INDEX (content) -- ↑と↓を追加) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
ポイント:全文検索の索引を作ると言っているだけ
![Page 30: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/30.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaを使う:検索
SELECT * FROM texts WHERE MATCH(content) AGAINST('*D+ キーワード1 キーワード2' IN BOOLEAN MODE);
ポイント:Web検索エンジンと同様にクエリーを書ける
![Page 31: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/31.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
なぜ知識なしで使えるの?
適切なデフォルト値
![Page 32: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/32.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
デフォルト値
トークナイザー:可変長Bigram(トークナイザー≒検索キーワード抽出モジュール)
日本語+英語でもいい感じに動く
ノーマライザー:MySQL互換(ノーマライザー≒テキスト正規化モジュール)
一部非互換:🍣≠🍺
![Page 33: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/33.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ2
MySQLの機能を使える
![Page 34: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/34.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
MySQLの機能
レプリケーション
ユーザー管理
クライアントライブラリー
...
![Page 35: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/35.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ3
速い!
![Page 36: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/36.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
例:MySQL 5.7と比較ポイント:MySQL 5.7のInnoDBは日本語全文検索対応!
クエリー 文字数 InnoDBmecab
InnoDBbigram
Mroongabigram
COUNT 1 2.62s N/A 0.74s
COUNT 2 0.07s 1.74s 0.27s
ORDER BY
1 2.78s N/A 0.83s
ORDER BY
2 0.09s 2.72s 0.31s
出典:MySQLの全文検索に関するあれやこれや by yoku0825http://www.slideshare.net/yoku0825/mysql-47364986
InnoDB mecabは遅いことがある
Mroongaは安定して速い
![Page 37: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/37.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
MySQL 5.7で日本語全文検索
CREATE TABLE texts ( content TEXT, FULLTEXT INDEX (content) WITH PARSER mecab -- ←がポイント) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
mecabの代わりにngramも指定できるが実用的ではなさそうmecabを使い場合は↑の他にMeCabの設定が必要
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-mecab.html
![Page 38: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/38.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga vs MySQL 5.7
Mroongaデフォルトでいい感じに動く(選びたければ指定できる)
安定して速い
MySQL 5.7 InnoDBパーサーを選ばないといけない(mecab?ngram?違いは?)
遅いこともある
![Page 39: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/39.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:1
Groonga直結↓
Groongaが速いとMroongaも速い
![Page 40: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/40.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:2
ORDER BY LIMITを最適化
![Page 41: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/41.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ORDER BY LIMIT最適化
SELECT * FROM texts WHERE MATCH(content1) AGAINST('...' IN BOOLEAN MODE) ORDER BY priority LIMIT 10;
MySQLに先頭10件しか返さないORDER BY LIMITをMySQLが処理するよりGroongaが処理する方が速いので速くなる
![Page 42: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/42.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ORDER BY LIMIT最適化!
SELECT * FROM texts WHERE MATCH(content) AGAINST('...' IN BOOLEAN MODE) AND n_likes < 100 -- 追加 ORDER BY priority LIMIT 10;
Groonga:MATCH AGAINST以外も処理MySQLが処理するよりGroongaが処理する方が速いので速くなる
![Page 43: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/43.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:3
必要なカラムのみ
アクセス
![Page 44: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/44.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
必要なカラムのみアクセス
SELECT c1, c3, c5 FROM t;
c2, c4にはアクセスしない→I/Oが減って速い
![Page 45: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/45.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaはカラムストア
必要なカラムのみアクセスできる理由
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Groonga
カラム毎
RDBMSなど
カラム 行
値の管理 行毎
得意なアクセス単位
![Page 46: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/46.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:PGroonga
ぴーじーるんがPostgreSQL + Groonga
![Page 47: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/47.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ1
簡単に使える
![Page 48: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/48.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
簡単
SQLで使える
全文検索の知識なしで使い始められる
![Page 49: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/49.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaを使う:索引
CREATE INDEX name ON texts USING pgroonga (content);
ポイント:全文検索の索引を作ると言っているだけ
![Page 50: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/50.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaを使う:検索
SELECT * FROM texts WHERE content @@ 'キーワード1 キーワード2';
ポイント:Web検索エンジンと同様にクエリーを書ける
![Page 51: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/51.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
なぜ知識なしで使えるの?
適切なデフォルト値
![Page 52: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/52.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
デフォルト値
トークナイザー:可変長Bigram(トークナイザー≒検索キーワード抽出モジュール)
日本語+英語でもいい感じに動く
ノーマライザー:NFKC(ノーマライザー≒テキスト正規化モジュール)
Unicode正規化形式の1つ
![Page 53: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/53.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ2
PostgreSQLの機能を使える
![Page 54: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/54.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PostgreSQLの機能
トランザクション
ユーザー管理
クライアントライブラリー
...
![Page 55: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/55.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ3
速い!
![Page 56: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/56.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
例:pg_bigmと比較
ポイント:PostgreSQL標準では日本語全文検索非対応
ヒット数 PGroonga pg_bigm
368 0.030s 0.107s
17,172 0.121s 1.224s
22,885 0.179s 2.472s
625,792(*) 0.646s 0.556s
データ:Wikipedia日本語版約184万レコード・平均サイズ約3.8KB詳細:http://www.clear-code.com/blog/2015/5/25.html
(*) 他は検索語が3文字以上でこれだけ2文字
PGroongaは安定して速い!
![Page 57: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/57.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
更新中も性能維持検索スループット
更新スループット
Groonga
検索スループット
更新スループット
更新中は参照不可の
エンジン
更新が増えても
検索性能は落ちない
更新が増えると
検索性能が落ちる
![Page 58: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/58.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
GINと更新と参照
接続1
接続2
INSERT開始
SELECT開始
ブロック
INSERT完了
SELECT完了
GINの場合
性能劣化!
GINはpg_bigmが使っているPostgreSQL標準の転置索引実装
![Page 59: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/59.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaと更新と参照
接続1
接続2
INSERT開始
SELECT開始
INSERT完了
SELECT完了
PGroongaの場合
性能劣化なし!
PGroongaはGroongaを使っているので参照ロックフリー
![Page 60: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/60.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ロード時間も速い
元データのロード時間
索引作成時間PGroonga
索引作成時間pg_bigm
16分31秒 25分37秒 5時間56分15秒
データ:Wikipedia日本語版約184万レコード・平均サイズ約3.8KB詳細:http://www.clear-code.com/blog/2015/5/25.html
pg_bigmより約14倍速い!
![Page 61: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/61.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Rroonga
るるんがRuby + Groonga
![Page 62: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/62.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaのよいところ1
Rubyで書ける
![Page 63: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/63.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
RubyでDB作成
Groonga::Database.create(:path => "/tmp/db")
![Page 64: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/64.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyでテーブル定義
Groonga::Schema.define do |schema| schema.create_table("Users", :type => :hash) do |table| table.short_text("name") table.int8("age") endend
![Page 65: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/65.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyでデータロード
users = Groonga["Users"]users.add("alice", :name => "Alice", :age => 29)
![Page 66: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/66.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyでデータロード
users = Groonga["Users"]users.add("alice", :name => "Alice", :age => 29)
![Page 67: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/67.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyで検索
twentys = users.select do |record| (record.age >= 20) & (record.age < 30)endtwentys.each do |twenty| p twenty.name # => "Alice"end
![Page 68: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/68.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaのよいところ2
サーバーいらず
![Page 69: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/69.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
サーバーいらず
ローカルのDBを操作SQLiteと同じ
向き不向き向き:1台で扱えるデータ量
不向き:1台で扱えないデータ量
![Page 70: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/70.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例1
Milkodeソースコード
検索http://milkode.ongaeshi.me/
![Page 71: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/71.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mlikode
行指向のソースコード検索grepの親戚
数万ファイルも余裕grepだと遅いけど1台で扱える量
検索方法Rroongaでファイル検索
→絞り込んだファイルをgrepポイント:絞り込んだ後ならgrepでも速い!
![Page 72: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/72.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例2
ROMA分散KVS
http://roma-kvs.org/
![Page 73: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/73.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ROMA
Rakuten/RubyOn-MemoryArchitecture
Rubyで実装された分散KVS
ストレージにGroongaを利用Tokyo Cabinetも使える
![Page 74: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/74.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例3
Droonga
![Page 75: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/75.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Droonga
どぅるんがDistributed Groonga
分散対応Groonga
![Page 76: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/76.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Droongaのよいところ1
分散機能
![Page 77: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/77.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
分散機能
レプリケーション:実装済みダウンタイムなしでノード追加可能
データ複製
参照性能・可用性向上
シャーディング:実装予定データ分割
更新性能・最大データ量向上
![Page 78: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/78.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
レプリケーション時の性能
![Page 79: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/79.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Droongaのよいところ2
Groonga互換API
![Page 80: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/80.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga互換API
Groongaと同じように使えるGroongaからの移行手順ありhttp://droonga.org/ja/tutorial/groonga/
DroongaからGroongaも可
クライアント無変更で動く
![Page 81: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/81.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
概要のまとめ
Groonga:高速・日本語得意
Mroonga:高速・簡単
PGroonga:高速・簡単
Rroonga:高速・手軽
Droonga:高速・スケーラブル
![Page 82: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/82.jpg)
最新情報
![Page 83: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/83.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Groonga
ぐるんが
![Page 84: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/84.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 1
groonga-httpdを正式機能に
![Page 85: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/85.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
groonga-httpd
nginxにGroongaを組み込みGroonga族
nginxのモジュールとして実装
Groonga HTTPサーバー互換
↑より高機能(HTTPサーバーとして)
認証・TLS・HTTP/2
![Page 86: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/86.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 2
WindowsでのDBサイズ減少
(1/3以下になるケースもあり)
![Page 87: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/87.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 3
ドリルダウンの高機能化
![Page 88: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/88.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ドリルダウンの高機能化1
集計処理を追加
既存:カウントのみ
追加:合計・最小値・最大値・平均
![Page 89: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/89.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ドリルダウン+平均
グループでドリルダウンしてグループ毎の平均年齢も計算
% curl \ 'localhost:10041/d/select' \ --get \ --data-urlencode 'table=users' \ --data-urlencode 'drilldown=group' \ --data-urlencode 'drilldown_calc_types=AVG' \ --data-urlencode 'drilldown_calc_target=age' \ --data-urlencode 'drilldown_output_columns=_key,_avg'
![Page 90: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/90.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
平均の出力例
[... [ [100], # 100グループ [ ["_key", "ShortText"], ["_avg", "Float"] ], [ ["グループ1", 29.0], # 平均29.0歳 ["グループ2", 22.9], # 平均22.9歳 ... ]]]
![Page 91: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/91.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ドリルダウンの高機能化2
複数キーでのドリルダウン↓
クロス集計
例:市と年齢でのクロス集計市\年齢 20歳 21歳
札幌市 999人 100人
仙台市 500人 200人
![Page 92: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/92.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
複数キードリルダウン例
市と年齢でドリルダウン
% curl \ 'localhost:10041/d/select' \ --get \ --data-urlencode 'table=users' \ --data-urlencode \ 'drilldown[city_age].keys=city,age' \ --data-urlencode \ 'drilldown[city_age].output_columns= _value.city,_value.age,_nsubrecs'
![Page 93: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/93.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
出力例
[... [ [100], # 100パターン [ ["city", "ShortText"], ["age", "Int8"] ["_nsubrecs", "Int32"] ], [ ["札幌市", 20, 999], # 札幌市の20歳は999人 ["札幌市", 21, 100], # 札幌市の21歳は100人 ["仙台市", 20, 500], # 仙台市の20歳は500人 ... ]]]
![Page 94: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/94.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 4
リクエストキャンセル対応
![Page 95: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/95.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
リクエストキャンセル
% curl \ 'localhost:10041/d/select' \ --get \ --data-urlencode 'table=users' \ --data-urlencode 'request_id=XXX' &% curl \ 'localhost:10041/d/request_cancel' \ --get \ --data-urlencode 'id=XXX'
注:リクエストIDを重複無く付けることはクライアントの責任
![Page 96: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/96.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 5
dumpのストリーム対応
![Page 97: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/97.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
dumpのストリーム対応
Beforeメモリー上で全部作ってから出力
大きなDBではメモリー使用量が多い
Afterダンプ内容を順次出力
大きなDBでもメモリー消費が少ない
![Page 98: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/98.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 6
シャーディング対応
![Page 99: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/99.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング対応
同一DB内複数のホストにデータ分散ではない
目的テーブルの最大レコード数制限突破1テーブルあたり最大約2億レコード
サポート月・日でのシャーディング
![Page 100: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/100.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング:定義
% curl 'localhost:10041/d/table_create' \ --get \ --data-urlencode 'name=Logs_20151129' \ --data-urlencode 'flags=TABLE_NO_KEY'% curl 'localhost:10041/d/column_create' \ --get \ --data-urlencode 'table=Logs_20151129' \ --data-urlencode 'name=timestamp' \ --data-urlencode 'flags=COLUMN_SCALAR' \ --data-urlencode 'type=Time'
![Page 101: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/101.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング:ロード
[{"timestamp": "2015-11-29 00:00:29"},{"timestamp": "2015-11-29 00:00:30"},{"timestamp": "2015-11-29 00:00:31"}]
![Page 102: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/102.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング:準備
% curl 'localhost:10041/d/plugin_register' \ --gets \ --data-urlencode 'name=sharding'
![Page 103: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/103.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング:検索
logical_select \ --logical_table Logs \ --shard_key timestamp \ --min "2015-11-29 00:00:00" \ --min_border "include" \ --max "2015-11-30 00:00:00" \ --max_border "exclude" \ --filter "..."
![Page 104: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/104.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 7
正規表現対応
![Page 105: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/105.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
正規表現
構文はRubyと同じエンジンがRubyと同じだから
一部のパターンは索引を使える
前方一致:\A#{リテラル}
中間一致:#{リテラル}
後方一致:#{リテラル}\z
![Page 106: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/106.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
正規表現:使い方
select \ --filter 'content @~ "\\AHello"'
演算子は@~
エスケープが煩雑なので注意
![Page 107: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/107.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 8
カスタムスコア関数対応
![Page 108: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/108.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
スコア関数
文書がどのくらいクエリーに適合しているかの度合いを返す関数
これまではTFのみTF=単語の出現数
=単語の出現数がスコア
![Page 109: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/109.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
新スコア関数
score_tf_idfTF-IDFベースのスコア関数
単語の出現数を単語の重要度で補正
score_tf_at_most上限値付きTFベースのスコア関数
スパマー対策ならこれで十分
![Page 110: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/110.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
スコア関数:使い方
select Logs \ --match_columns \ "scorer_tf_at_most(body, 3.0)" \ --query "keyword1 keyword2"
match_columnsで指定
![Page 111: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/111.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 9
ログローテーション
対応
![Page 112: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/112.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ログローテーション
使い方groongaコマンドの起動オプション
オプション
--log-rotate-threshold-size
--query-log-rotate-threshold-size
![Page 113: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/113.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 10
キャッシュの最大キーサイズ
増加
![Page 114: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/114.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
キャッシュのキーサイズ
Before4KiB
After64KiB - 1
![Page 115: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/115.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 11
io_flush追加
![Page 116: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/116.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
io_flush
メモリー上のデータをディスクに書き込むコマンド通常はOSに任せている
目的:クラッシュ対策UNIX: プロセスが死んでもカーネルが生きていればいずれ書き込まれる
Windows: プロセスが死ぬと書き込まれない
![Page 117: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/117.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 12
使った索引をログ出力
![Page 118: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/118.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
使った索引をログ出力
チューニングに便利
SQLのEXPLAINの不便バージョンサーバーのログを確認しないといけないから
ログレベルに注意デフォルトでは出力されない
debugにすること
![Page 119: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/119.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 13
Windowsイベントログ
対応
![Page 120: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/120.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Windowsイベントログ
使い方
% groonga --use-windows-event-log
![Page 121: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/121.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 14
スレッド数の動的変更対応
![Page 122: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/122.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
スレッド数変更
最大8スレッドに変更する例
% curl \ 'localhost:10041/d/thread_limit' \ --get \ --data-urlencode 'max=8'
![Page 123: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/123.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 15
column_copy追加
![Page 124: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/124.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
column_copy
カラムの値をコピーサーバーサイドで実行
利用例テーブル・カラム定義変更
新カラム作成→コピー→
旧カラム削除→リネーム
![Page 125: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/125.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 16
Pretty print対応
![Page 126: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/126.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
従来
% curl 'localhost:10041/d/status'[[0,...],{"alloc_count":248,...}]
![Page 127: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/127.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Pretty print
% curl \ 'localhost:10041/d/status' \ --get \ --data-urlencode 'output_pretty=yes'[ [ 0, ... ], { "alloc_count": 248, ... }]
![Page 128: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/128.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 17
新コマンド
![Page 129: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/129.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
新コマンド
reindex既存インデックスを再作成
schemaスキーマを返す
thread_limit最大スレッド数を動的に変更
![Page 130: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/130.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 18
新関数
![Page 131: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/131.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
新関数
prefix_rk_search()ローマ字で検索
selectで補完できる
![Page 132: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/132.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 19
Groonga Admin進化
![Page 133: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/133.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga Admin
Groongaの新しい管理画面旧:Webからコマンドを実行できる
新:詳細を知らずに使える
試せるhttp://packages.groonga.org:10041/
![Page 134: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/134.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Mroonga
むるんがMySQL + Groonga
![Page 135: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/135.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 1
mroonga_boolean_mode_syntax_flags
IN BOOLEAN MODEでの構文を変更スクリプト構文→使える演算子が増加
![Page 136: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/136.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
スクリプト構文
SET mroonga_boolean_mode_syntax_flags = "SYNTAX_SCRIPT";
SELECT * FROM memos WHERE MATCH(title) AGAINST('title @~ ".+roonga"' IN BOOLEAN MODE);
正規表現を使う例他にも関数を使えたり比較演算子を使えたりするMATCHに指定していないカラムでも検索できる
![Page 137: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/137.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 2
MariaDBカスタム
パラメーター対応
![Page 138: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/138.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
インデックスパラメーター
CREATE TABLE memos ( body text, FULLTEXT INDEX body_index (body) TOKENIZER='TokenMecab' NORMALIZER='NormalizerAuto' TOKEN_FILTERS='TokenFilterStopWord' -- ↑COMMENTに書かなくてよい!) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
![Page 139: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/139.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
カラムパラメーター
CREATE TABLE tags ( name VARCHAR(64) PRIMARY KEY) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
CREATE TABLE bugs ( tag VARCHAR(64) GROONGA_TYPE='tags') ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
![Page 140: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/140.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 3
MySQL 5.7対応
![Page 141: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/141.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
MySQL 5.7対応
MySQL 5.7でビルドできる
JSON型対応
![Page 142: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/142.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
JSON型
CREATE TABLE logs ( record JSON) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;INSERT INTO logs VALUES ('{"message": "start"}');
![Page 143: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/143.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 4
MariaDB 10.1対応
![Page 144: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/144.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Droonga
どぅるんがDistributed Groonga
分散対応Groonga
![Page 145: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/145.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Droonga: 1
ダウンタイムなしの
ノード追加対応
![Page 146: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/146.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今年のまとめ
Groonga:たくさん改良
Mroonga使い勝手改良・最新対応
PGroonga: 今年デビュー
Rroonga:最新対応
Droonga:可用性向上
![Page 147: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/147.jpg)
今後
![Page 148: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/148.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
ヒント
実現は保証しない実現しようとはするよ!
実現可能性を高めるには…開発に参加コード・ドキュメントを書く・テストする・宣伝する
開発者が開発する時間を増やす他のユーザーをサポート・情報公開・仕事を頼む
![Page 149: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/149.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今後:Groonga
ぐるんが
![Page 150: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/150.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 1
カラムストアをもっと活かす
シーケンシャルサーチを速く!
ソートを速く!
ドリルダウンを速く!
↓grn_ts(ぐるんたす)
![Page 151: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/151.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 2
mrubyをデフォルト有効
プラグインをRubyで書ける
式を書き換えられる
オプティマイザーを書ける
![Page 152: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/152.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 3
プラグインエコシステム
プラグイン管理コマンド提供
例:grn plugin install XXX
プラグインリポジトリー提供GoのようにGitから直接インストールでもいいかも
対応プラグインRubyで書かれたプラグイン
![Page 153: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/153.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 4
位置指定マッチ対応
N番目のトークンならマッチ
例:1番目のトークンはhello?
マッチする:hello world
マッチしない:hey! hello world
![Page 154: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/154.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
位置指定マッチ応用例1
正規表現の前方一致検索
Groongaでの構文:\A例:\Ahello
実装:1番目のトークンかチェック
![Page 155: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/155.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
位置指定マッチ応用例2
ベクターのN番目の要素にマッチ
{ "rank": ["Alice", "Bob", "Chris"]}# rank[0] @ "Bob"→マッチしない# rank[1] @ "Bob"→マッチする
![Page 156: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/156.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 5
selectで計算結果でのドリルダウン・ソートに対応
例元データ:日時(2015-11-29 13:30)
計算結果:年月日(2015-11-29)
ドリルダウン:計算結果を使用(2015-11-29: 1件、2015-11-30: 2件)
![Page 157: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/157.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
select例
select Logs \ --column[access_day].type Time \ --column[access_day].source \ 'time_floor_year(access_time)' \ --drilldown access_day
![Page 158: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/158.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 6
JSONでのパラメーター指定(も使えるようにする)
メリットプログラムから指定しやすいことがあるかもしれない
デメリットクエリーログに残らない
![Page 159: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/159.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
クエリーストリング
現行
% curl \ 'localhost:10041/d/select' \ --get \ --data-urlencode 'table=users' \ --data-urlencode 'limit=100'
![Page 160: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/160.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
JSON
% cat select.json{ "table": "users", "limit": "100"}% curl \ 'localhost:10041/d/select' \ --header 'Content-Type: application/json' \ --data-binary @select.json
![Page 161: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/161.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 7
ドキュメント改善
未ドキュメントな項目を書く
古いドキュメントを更新
![Page 162: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/162.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今後:Mroonga
むるんがMySQL + Groonga
![Page 163: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/163.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 1ラッパーモードでロールバック対応
現状:ロールバック非対応(変更が残ってしまい検索結果に不整合発生)
今後:コミット時にまとめて更新(ロールバックしても変更が残らない)
現状:トランザクション中に更新データを検索可能今後:検索不可能
![Page 164: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/164.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 2
MariaDBでテーブルパラメーター対応
CREATE TABLE xxx () ENGINE=Mroonga COMMENT='ENGINE "InnoDB"' -- ↑を↓と書ける WRAP ENGINE=InnoDB;
![Page 165: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/165.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 3
generated column対応MySQL 5.7で導入。MariaDBでいうvirtual column。
CREATE TABLE users ( first_name text, last_name text, full_name text AS (CONCAT_WS(' ', first_name, last_name)) STORED) ENGINE=Mroonga;
![Page 166: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/166.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 4
ネイティブパーテション対応MySQL 5.7で導入。FULLTEXT INDEXを使えるようになる!
CREATE TABLE memos ( created_time DATETIME, content text, FULLTEXT INDEX (content)) ENGINE=Mroonga PARTITION BY RANGE (TO_DAYS(timestamp)) ( -- ... );
![Page 167: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/167.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 5
JSONの全文検索対応
CREATE TABLE logs ( message JSON, FULLTEXT INDEX (message)) ENGINE=Mroonga;SELECT * FROM logs WHERE MATCH(message) AGAINST('*D+ error' IN BOOLEAN MODE);
![Page 168: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/168.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 6
同義語展開対応
SELECT * FROM memos WHERE MATCH(content) AGAINST(mroonga_expand_query('*D+ 焼き肉') IN BOOLEAN MODE);-- → AGAINST('*D+ 焼き肉 OR 焼肉' IN BOOLEAN MDOE)-- 同義語はMroongaのテーブルにして-- SQLで管理できるようにする
![Page 169: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/169.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 7
ドキュメント改善
Sphinx→GitHub PagesSphinx・reSTはオーバースペック
Markdownで十分
typoを見つけても正しく直せない
![Page 170: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/170.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今後:PGroonga
ぴーじーるんがPostgreSQL + Groonga
![Page 171: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/171.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 1
text @@ pgroonga.queryを導入
SET enable_indexscan = off;SET enable_bitmapscan = off;SELECT * FROM WHERE content @@ '全文検索';-- ↑PostgreSQL組み込みの@@が使われるSELECT * FROM WHERE content @@ '全文検索'::pgroonga.query;-- ↑PGroonga提供の@@が使われる
![Page 172: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/172.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 2
もっとGroongaを活かす
PGroonga pg_bigm Groonga
0.646s 0.556s 0.085s
ヒット数635,792、検索語は2文字
生Groongaは1桁速い!詳細:https://github.com/groonga/wikipedia-search/issues/3
![Page 173: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/173.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 3
同義語展開対応
body @@ pgroonga.expand_query('ネジ')-- ↓body @@ 'ネジ OR ねじ OR ボルト'
![Page 174: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/174.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 4
ステミング対応
found/finds→find
CREATE INDEX index ON entries USING pgroonga (title) WITH (token_filters = 'TokenStem');
![Page 175: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/175.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 5
重み対応
-- タイトルのほうが本文より10倍重要body @@ ('title * 10 || body', 'ポスグレ')
![Page 176: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/176.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 6
複合主キー対応
CREATE TABLE t ( c1 INT, c2 INT, PRIMARY KEY (c1, c2));CREATE INDEX index ON t USING pgroonga (c1, c2);
![Page 177: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/177.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 7
pg_dumpのWITH問題を解消
CREATE INDEX index ON t USING pgroonga (c) WITH (tokenizer = 'TokenMecab');-- ↓pg_dump: クォートがとれる→小文字に正規化されるCREATE INDEX index ON t USING pgroonga (c) WITH (tokenizer = TokenMecab);
![Page 178: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/178.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今後:Rroonga
るるんがRuby + Groonga
![Page 179: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/179.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Rroonga: 1
ドキュメント改善
Textile→Markdown
英語化
説明追加(主にコード例)
![Page 180: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/180.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
今後:Droonga
どぅるんがDistributed Groonga
分散対応Groonga
![Page 181: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/181.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Droonga: 1
シャーディング対応
![Page 182: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/182.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族以外
キラーアプリが欲しい
世界規模で認知されたいMroonga・PGroongaをきっかけにMroongaはMariaDBにバンドルされている
本を出したい初心者向けのやつ
![Page 183: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/183.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
まとめ
Groonga族は今年も進化した
Groonga族は来年も進化する
来年はもっと世界規模でユーザーを増やしたい
![Page 184: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/184.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
おしらせ1
Groongaで学ぶ全文検索↑で検索!
隔週金曜の夜開催
予習復習なしで時間内で効率よく全文検索を学ぶ会
参加者のレベルは問わない
内容は毎回参加者に合わせて決める
全文検索を学びたい方はどうぞ!
![Page 185: Groonga族 2015](https://reader033.vdocuments.mx/reader033/viewer/2022061610/5895abe61a28ab3f048bd055/html5/thumbnails/185.jpg)
Groonga族2015 Powered by Rabbit 2.1.9
おしらせ2
MySQLとPostgreSQLと日本語全文検索
来年2月9日(肉の日)DMM.comラボにて