SlideShare a Scribd company logo
1 of 185
Download to read offline
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族
2015
須藤功平 株式会社クリアコード
Groonga Meatup 2015
2015-11-29
Groonga族2015 Powered by Rabbit 2.1.9
内容
Groonga族の概要
Groonga族の最新情報
Groonga族の今後の情報
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族
総称
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族
Groongaそのもの
Groongaと他のプロダクトを
つなぐプロダクト
名前がXroonga
Groonga族2015 Powered by Rabbit 2.1.9
つなぐプロダクト
MySQL
ライブラリー
Ruby
API
PostgreSQL 他のプロダクト
つなぐプロダクト
Groonga
SQL SQL
ポイント
Groongaはライブラリーとして他のプロダクトに埋め込める!
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Groonga
ぐるんが
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ1
高速な
全文検索機能(全文検索エンジンなので当然)
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ2
即時更新
Groonga族2015 Powered by Rabbit 2.1.9
即時更新
更新→すぐに検索可能
思想:新鮮なデータは高価値
新しいデータはすぐに入れて!
工夫:更新中も検索性能キープ
即時データ投入を妨げる理由を減少
実装:参照ロックフリー
Groonga族2015 Powered by Rabbit 2.1.9
性能の傾向検索スループット
更新スループット
Groonga
検索スループット
更新スループット
更新中は参照不可の
エンジン
更新が増えても
検索性能は落ちない
更新が増えると
検索性能が落ちる
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ3
高速な集計処理
Groonga族2015 Powered by Rabbit 2.1.9
高速な集計処理
集計処理
同一カラムの値を一気にアクセス
工夫:↑向けデータ構造を採用
高速な集計処理を実現
実装:カラムストア
Groonga族2015 Powered by Rabbit 2.1.9
カラムストア
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Groonga
カラム毎
RDBMSなど
カラム 行
値の管理 行毎
得意なアクセス単位
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ3
手厚い
日本語サポート
Groonga族2015 Powered by Rabbit 2.1.9
サポート例:RKサーチ
ローマ字でカナを検索
Romaji to Kana prefix search
例:「ya」→「ヤキニク」
「や」・「ヤ」→「ヤキニク」も可
用意するもの
カタカナでのヨミガナだけ
(ひらがな・ローマ字はいらない)
(ローマ字の訓令式・ヘボン式の差はGroongaが吸
収)
Groonga族2015 Powered by Rabbit 2.1.9
RKサーチの利用例1
入力補助
例:タグの入力
同じことに違うタグをつけると検索精度があがらない
全体で一貫性があることは重要
既存のタグを入力補助することで同じことに同じタグを
つけやすくする
使い所:妥当な値の集合がある
タグ入力なら既存タグ
Groonga族2015 Powered by Rabbit 2.1.9
RKサーチの利用例2
検索ボックスでの補完
Googleもやっているやつ
ぐるなびはGroongaで実現
Groonga族2015 Powered by Rabbit 2.1.9
ぐるなびでの利用例
「yu」→「ユウラクチョウ」→「有楽町」
出典:Groongaのサジェストで四苦八苦 by Walker
https://speakerdeck.com/redfigure/
groongafalsesaziesutodesi-ku-ba-ku
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方1
スキーマ作成
% groonga-suggest-create-dataset 
DB_PATH stations
Groonga族2015 Powered by Rabbit 2.1.9
補完の使い方2
データ準備
[
{
"_key": "有楽町",
"kana": ["ユウラクチョウ"],
"boost": 100
}
]
boostを100以上にすること
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は改行を削除するため
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]]}
]
Groonga族2015 Powered by Rabbit 2.1.9
Groongaのよいところ4
組み込める
Groonga族2015 Powered by Rabbit 2.1.9
組み込める
ライブラリーとして利用可能
=インターフェイスを変えられる
=使いやすい方法で使える
Groonga族2015 Powered by Rabbit 2.1.9
つなぐプロダクト
MySQL
ライブラリー
Ruby
API
PostgreSQL 他のプロダクト
つなぐプロダクト
Groonga
SQL SQL
ポイント
Groongaはライブラリーとして他のプロダクトに埋め込める!
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Mroonga
むるんが
MySQL + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ1
簡単に使える
Groonga族2015 Powered by Rabbit 2.1.9
簡単
SQLで使える
全文検索の知識なしで
使い始められる
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaを使う:スキーマ
CREATE TABLE texts (
content TEXT,
FULLTEXT INDEX (content)
-- ↑と↓を追加
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
ポイント:全文検索の索引を作ると言っているだけ
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaを使う:検索
SELECT * FROM texts
WHERE
MATCH(content)
AGAINST('*D+ キーワード1 キーワード2'
IN BOOLEAN MODE);
ポイント:Web検索エンジンと同様にクエリーを書ける
Groonga族2015 Powered by Rabbit 2.1.9
なぜ知識なしで使えるの?
適切な
デフォルト値
Groonga族2015 Powered by Rabbit 2.1.9
デフォルト値
トークナイザー:可変長Bigram
(トークナイザー≒検索キーワード抽出モジュール)
日本語+英語でもいい感じに動く
ノーマライザー:MySQL互換
(ノーマライザー≒テキスト正規化モジュール)
一部非互換:🍣≠🍺
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ2
MySQLの機能を
使える
Groonga族2015 Powered by Rabbit 2.1.9
MySQLの機能
レプリケーション
ユーザー管理
クライアントライブラリー
...
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaのよいところ3
速い!
Groonga族2015 Powered by Rabbit 2.1.9
例:MySQL 5.7と比較ポイント:MySQL 5.7のInnoDBは日本語全文検索対応!
クエリー 文字数 InnoDB
mecab
InnoDB
bigram
Mroonga
bigram
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 yoku0825
http://www.slideshare.net/yoku0825/mysql-47364986
InnoDB mecabは遅いことがある
Mroongaは安定して速い
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
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga vs MySQL 5.7
Mroonga
デフォルトでいい感じに動く
(選びたければ指定できる)
安定して速い
MySQL 5.7 InnoDB
パーサーを選ばないといけない
(mecab?ngram?違いは?)
遅いこともある
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:1
Groonga直結
↓
Groongaが速いと
Mroongaも速い
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:2
ORDER BY LIMIT
を最適化
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が処理する方が速いので速くなる
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が処理する方が速いので速くなる
Groonga族2015 Powered by Rabbit 2.1.9
Mroongaが速い理由:3
必要なカラム
のみ
アクセス
Groonga族2015 Powered by Rabbit 2.1.9
必要なカラムのみアクセス
SELECT c1, c3, c5 FROM t;
c2, c4にはアクセスしない
→I/Oが減って速い
Groonga族2015 Powered by Rabbit 2.1.9
Groongaはカラムストア
必要なカラムのみアクセスできる理由
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Groonga
カラム毎
RDBMSなど
カラム 行
値の管理 行毎
得意なアクセス単位
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:PGroonga
ぴーじーるんが
PostgreSQL + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ1
簡単に使える
Groonga族2015 Powered by Rabbit 2.1.9
簡単
SQLで使える
全文検索の知識なしで
使い始められる
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaを使う:索引
CREATE INDEX name ON texts
USING pgroonga (content);
ポイント:全文検索の索引を作ると言っているだけ
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaを使う:検索
SELECT * FROM texts
WHERE
content @@ 'キーワード1 キーワード2';
ポイント:Web検索エンジンと同様にクエリーを書ける
Groonga族2015 Powered by Rabbit 2.1.9
なぜ知識なしで使えるの?
適切な
デフォルト値
Groonga族2015 Powered by Rabbit 2.1.9
デフォルト値
トークナイザー:可変長Bigram
(トークナイザー≒検索キーワード抽出モジュール)
日本語+英語でもいい感じに動く
ノーマライザー:NFKC
(ノーマライザー≒テキスト正規化モジュール)
Unicode正規化形式の1つ
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ2
PostgreSQLの
機能を使える
Groonga族2015 Powered by Rabbit 2.1.9
PostgreSQLの機能
トランザクション
ユーザー管理
クライアントライブラリー
...
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaのよいところ3
速い!
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は安定して速い!
Groonga族2015 Powered by Rabbit 2.1.9
更新中も性能維持検索スループット
更新スループット
Groonga
検索スループット
更新スループット
更新中は参照不可の
エンジン
更新が増えても
検索性能は落ちない
更新が増えると
検索性能が落ちる
Groonga族2015 Powered by Rabbit 2.1.9
GINと更新と参照
接続1
接続2
INSERT
開始
SELECT
開始
ブロック
INSERT
完了
SELECT
完了
GINの場合
性能劣化!
GINはpg_bigmが使っているPostgreSQL標準の転置索引実装
Groonga族2015 Powered by Rabbit 2.1.9
PGroongaと更新と参照
接続1
接続2
INSERT
開始
SELECT
開始
INSERT
完了
SELECT
完了
PGroongaの場合
性能劣化なし!
PGroongaはGroongaを使っているので参照ロックフリー
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倍速い!
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Rroonga
るるんが
Ruby + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaのよいところ1
Rubyで書ける
Groonga族2015 Powered by Rabbit 2.1.9
RubyでDB作成
Groonga::Database.create(:path => "/tmp/db")
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")
end
end
Groonga族2015 Powered by Rabbit 2.1.9
Rubyでデータロード
users = Groonga["Users"]
users.add("alice",
:name => "Alice",
:age => 29)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyでデータロード
users = Groonga["Users"]
users.add("alice",
:name => "Alice",
:age => 29)
Groonga族2015 Powered by Rabbit 2.1.9
Rubyで検索
twentys = users.select do |record|
(record.age >= 20) & (record.age < 30)
end
twentys.each do |twenty|
p twenty.name # => "Alice"
end
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaのよいところ2
サーバーいらず
Groonga族2015 Powered by Rabbit 2.1.9
サーバーいらず
ローカルのDBを操作
SQLiteと同じ
向き不向き
向き:1台で扱えるデータ量
不向き:1台で扱えないデータ量
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例1
Milkode
ソースコード
検索http://milkode.ongaeshi.me/
Groonga族2015 Powered by Rabbit 2.1.9
Mlikode
行指向のソースコード検索
grepの親戚
数万ファイルも余裕
grepだと遅いけど1台で扱える量
検索方法
Rroongaでファイル検索
→絞り込んだファイルをgrep
ポイント:絞り込んだ後ならgrepでも速い!
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例2
ROMA
分散KVShttp://roma-kvs.org/
Groonga族2015 Powered by Rabbit 2.1.9
ROMA
Rakuten/Ruby
On-Memory
Architecture
Rubyで実装された分散KVS
ストレージにGroongaを利用
Tokyo Cabinetも使える
Groonga族2015 Powered by Rabbit 2.1.9
Rroongaの利用事例3
Droonga
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族:Droonga
どぅるんが
Distributed Groonga
分散対応Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Droongaのよいところ1
分散機能
Groonga族2015 Powered by Rabbit 2.1.9
分散機能
レプリケーション:実装済み
ダウンタイムなしでノード追加可能
データ複製
参照性能・可用性向上
シャーディング:実装予定
データ分割
更新性能・最大データ量向上
Groonga族2015 Powered by Rabbit 2.1.9
レプリケーション時の性能
Groonga族2015 Powered by Rabbit 2.1.9
Droongaのよいところ2
Groonga互換API
Groonga族2015 Powered by Rabbit 2.1.9
Groonga互換API
Groongaと同じように使える
Groongaからの移行手順あり
http://droonga.org/ja/tutorial/groonga/
DroongaからGroongaも可
クライアント無変更で動く
Groonga族2015 Powered by Rabbit 2.1.9
概要のまとめ
Groonga:高速・日本語得意
Mroonga:高速・簡単
PGroonga:高速・簡単
Rroonga:高速・手軽
Droonga:高速・スケーラブル
最新
情報
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Groonga
ぐるんが
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 1
groonga-httpdを
正式機能に
Groonga族2015 Powered by Rabbit 2.1.9
groonga-httpd
nginxにGroongaを組み込み
Groonga族
nginxのモジュールとして実装
Groonga HTTPサーバー互換
↑より高機能(HTTPサーバーとして)
認証・TLS・HTTP/2
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 2
Windowsでの
DBサイズ減少(1/3以下になるケースもあり)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 3
ドリルダウンの
高機能化
Groonga族2015 Powered by Rabbit 2.1.9
ドリルダウンの高機能化1
集計処理を追加
既存:
カウントのみ
追加:
合計・最小値・最大値・平均
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'
Groonga族2015 Powered by Rabbit 2.1.9
平均の出力例
[... [
[100], # 100グループ
[
["_key", "ShortText"],
["_avg", "Float"]
],
[
["グループ1", 29.0], # 平均29.0歳
["グループ2", 22.9], # 平均22.9歳
...
]]]
Groonga族2015 Powered by Rabbit 2.1.9
ドリルダウンの高機能化2
複数キーでのドリルダウン
↓
クロス集計
例:市と年齢でのクロス集計
市\年齢 20歳 21歳
札幌市 999人 100人
仙台市 500人 200人
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'
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人
...
]]]
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 4
リクエスト
キャンセル
対応
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を重複無く付けることはクライアントの責任
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 5
dumpの
ストリーム対応
Groonga族2015 Powered by Rabbit 2.1.9
dumpのストリーム対応
Before
メモリー上で全部作ってから出力
大きなDBではメモリー使用量が多い
After
ダンプ内容を順次出力
大きなDBでもメモリー消費が少ない
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 6
シャーディング
対応
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング対応
同一DB内
複数のホストにデータ分散ではない
目的
テーブルの最大レコード数制限突破
1テーブルあたり最大約2億レコード
サポート
月・日でのシャーディング
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'
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"}
]
Groonga族2015 Powered by Rabbit 2.1.9
シャーディング:準備
% curl 'localhost:10041/d/plugin_register' 
--gets 
--data-urlencode 'name=sharding'
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 "..."
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 7
正規表現対応
Groonga族2015 Powered by Rabbit 2.1.9
正規表現
構文はRubyと同じ
エンジンがRubyと同じだから
一部のパターンは索引を使える
前方一致:A#{リテラル}
中間一致:#{リテラル}
後方一致:#{リテラル}z
Groonga族2015 Powered by Rabbit 2.1.9
正規表現:使い方
select 
--filter 'content @~ "AHello"'
演算子は@~
エスケープが煩雑なので注意
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 8
カスタム
スコア関数対応
Groonga族2015 Powered by Rabbit 2.1.9
スコア関数
文書がどのくらいクエリーに
適合しているかの度合いを返す
関数
これまではTFのみ
TF=単語の出現数
=単語の出現数がスコア
Groonga族2015 Powered by Rabbit 2.1.9
新スコア関数
score_tf_idf
TF-IDFベースのスコア関数
単語の出現数を単語の重要度で補正
score_tf_at_most
上限値付きTFベースのスコア関数
スパマー対策ならこれで十分
Groonga族2015 Powered by Rabbit 2.1.9
スコア関数:使い方
select Logs 
--match_columns 
"scorer_tf_at_most(body, 3.0)" 
--query "keyword1 keyword2"
match_columnsで指定
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 9
ログ
ローテーション
対応
Groonga族2015 Powered by Rabbit 2.1.9
ログローテーション
使い方
groongaコマンドの起動オプション
オプション
--log-rotate-threshold-size
--query-log-rotate-threshold-size
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 10
キャッシュの
最大キーサイズ
増加
Groonga族2015 Powered by Rabbit 2.1.9
キャッシュのキーサイズ
Before
4KiB
After
64KiB - 1
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 11
io_flush追加
Groonga族2015 Powered by Rabbit 2.1.9
io_flush
メモリー上のデータを
ディスクに書き込むコマンド
通常はOSに任せている
目的:クラッシュ対策
UNIX: プロセスが死んでもカーネル
が生きていればいずれ書き込まれる
Windows: プロセスが死ぬと書き込
まれない
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 12
使った索引を
ログ出力
Groonga族2015 Powered by Rabbit 2.1.9
使った索引をログ出力
チューニングに便利
SQLのEXPLAINの不便バージョン
サーバーのログを確認しないといけないから
ログレベルに注意
デフォルトでは出力されない
debugにすること
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 13
Windows
イベントログ
対応
Groonga族2015 Powered by Rabbit 2.1.9
Windowsイベントログ
使い方
% groonga --use-windows-event-log
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 14
スレッド数の
動的変更対応
Groonga族2015 Powered by Rabbit 2.1.9
スレッド数変更
最大8スレッドに変更する例
% curl 
'localhost:10041/d/thread_limit' 
--get 
--data-urlencode 'max=8'
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 15
column_copy追加
Groonga族2015 Powered by Rabbit 2.1.9
column_copy
カラムの値をコピー
サーバーサイドで実行
利用例
テーブル・カラム定義変更
新カラム作成→コピー→
旧カラム削除→リネーム
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 16
Pretty print
対応
Groonga族2015 Powered by Rabbit 2.1.9
従来
% curl 'localhost:10041/d/status'
[[0,...],{"alloc_count":248,...}]
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,
...
}
]
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 17
新コマンド
Groonga族2015 Powered by Rabbit 2.1.9
新コマンド
reindex
既存インデックスを再作成
schema
スキーマを返す
thread_limit
最大スレッド数を動的に変更
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 18
新関数
Groonga族2015 Powered by Rabbit 2.1.9
新関数
prefix_rk_search()
ローマ字で検索
selectで補完できる
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 19
Groonga Admin
進化
Groonga族2015 Powered by Rabbit 2.1.9
Groonga Admin
Groongaの新しい管理画面
旧:Webからコマンドを実行できる
新:詳細を知らずに使える
試せる
http://packages.groonga.org:10041/
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Mroonga
むるんが
MySQL + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 1
mroonga_boolean_mode_syntax_flags
IN BOOLEAN MODEでの構文を変更
スクリプト構文→使える演算子が増加
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に指定していないカラムでも検索できる
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 2
MariaDB
カスタム
パラメーター
対応
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;
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;
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 3
MySQL 5.7対応
Groonga族2015 Powered by Rabbit 2.1.9
MySQL 5.7対応
MySQL 5.7でビルドできる
JSON型対応
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"}');
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 4
MariaDB 10.1
対応
Groonga族2015 Powered by Rabbit 2.1.9
最新情報:Droonga
どぅるんが
Distributed Groonga
分散対応Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Droonga: 1
ダウンタイム
なしの
ノード追加対応
Groonga族2015 Powered by Rabbit 2.1.9
今年のまとめ
Groonga:たくさん改良
Mroonga
使い勝手改良・最新対応
PGroonga: 今年デビュー
Rroonga:最新対応
Droonga:可用性向上
今後
Groonga族2015 Powered by Rabbit 2.1.9
ヒント
実現は保証しない
実現しようとはするよ!
実現可能性を高めるには…
開発に参加
コード・ドキュメントを書く・テストする・宣伝する
開発者が開発する時間を増やす
他のユーザーをサポート・情報公開・仕事を頼む
Groonga族2015 Powered by Rabbit 2.1.9
今後:Groonga
ぐるんが
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 1
カラムストアをもっと活かす
シーケンシャルサーチを速く!
ソートを速く!
ドリルダウンを速く!
↓
grn_ts(ぐるんたす)
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 2
mrubyをデフォルト有効
プラグインをRubyで書ける
式を書き換えられる
オプティマイザーを書ける
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 3
プラグインエコシステム
プラグイン管理コマンド提供
例:grn plugin install XXX
プラグインリポジトリー提供
GoのようにGitから直接インストールでもいいかも
対応プラグイン
Rubyで書かれたプラグイン
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 4
位置指定マッチ対応
N番目のトークンならマッチ
例:1番目のトークンはhello?
マッチする:hello world
マッチしない:hey! hello world
Groonga族2015 Powered by Rabbit 2.1.9
位置指定マッチ応用例1
正規表現の前方一致検索
Groongaでの構文:A
例:Ahello
実装:
1番目のトークンかチェック
Groonga族2015 Powered by Rabbit 2.1.9
位置指定マッチ応用例2
ベクターのN番目の要素にマッチ
{
"rank": ["Alice", "Bob", "Chris"]
}
# rank[0] @ "Bob"→マッチしない
# rank[1] @ "Bob"→マッチする
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件)
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
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 6
JSONでのパラメーター指定
(も使えるようにする)
メリット
プログラムから指定しやすい
ことがあるかもしれない
デメリット
クエリーログに残らない
Groonga族2015 Powered by Rabbit 2.1.9
クエリーストリング
現行
% curl 
'localhost:10041/d/select' 
--get 
--data-urlencode 'table=users' 
--data-urlencode 'limit=100'
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
Groonga族2015 Powered by Rabbit 2.1.9
Groonga: 7
ドキュメント改善
未ドキュメントな項目を書く
古いドキュメントを更新
Groonga族2015 Powered by Rabbit 2.1.9
今後:Mroonga
むるんが
MySQL + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 1
ラッパーモードで
ロールバック対応
現状:ロールバック非対応
(変更が残ってしまい検索結果に不整合発生)
今後:コミット時にまとめて更新
(ロールバックしても変更が残らない)
現状:トランザクション中に
更新データを検索可能
今後:検索不可能
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 2
MariaDBで
テーブルパラメーター対応
CREATE TABLE xxx (
) ENGINE=Mroonga
COMMENT='ENGINE "InnoDB"'
-- ↑を↓と書ける
WRAP ENGINE=InnoDB;
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;
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)) (
-- ...
);
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);
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で管理できるようにする
Groonga族2015 Powered by Rabbit 2.1.9
Mroonga: 7
ドキュメント改善
Sphinx→GitHub Pages
Sphinx・reSTはオーバースペック
Markdownで十分
typoを見つけても正しく直せない
Groonga族2015 Powered by Rabbit 2.1.9
今後:PGroonga
ぴーじーるんが
PostgreSQL + Groonga
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提供の@@が使われる
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
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 3
同義語展開対応
body @@ pgroonga.expand_query('ネジ')
-- ↓
body @@ 'ネジ OR ねじ OR ボルト'
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');
Groonga族2015 Powered by Rabbit 2.1.9
PGroonga: 5
重み対応
-- タイトルのほうが本文より10倍重要
body @@ ('title * 10 || body', 'ポスグレ')
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);
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);
Groonga族2015 Powered by Rabbit 2.1.9
今後:Rroonga
るるんが
Ruby + Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Rroonga: 1
ドキュメント改善
Textile→Markdown
英語化
説明追加(主にコード例)
Groonga族2015 Powered by Rabbit 2.1.9
今後:Droonga
どぅるんが
Distributed Groonga
分散対応Groonga
Groonga族2015 Powered by Rabbit 2.1.9
Droonga: 1
シャーディング
対応
Groonga族2015 Powered by Rabbit 2.1.9
Groonga族以外
キラーアプリが欲しい
世界規模で認知されたい
Mroonga・PGroongaをきっかけに
MroongaはMariaDBにバンドルされている
本を出したい
初心者向けのやつ
Groonga族2015 Powered by Rabbit 2.1.9
まとめ
Groonga族は今年も進化した
Groonga族は来年も進化する
来年はもっと世界規模で
ユーザーを増やしたい
Groonga族2015 Powered by Rabbit 2.1.9
おしらせ1
Groongaで学ぶ全文検索
↑で検索!
隔週金曜の夜開催
予習復習なしで時間内で
効率よく全文検索を学ぶ会
参加者のレベルは問わない
内容は毎回参加者に合わせて決める
全文検索を学びたい方はどうぞ!
Groonga族2015 Powered by Rabbit 2.1.9
おしらせ2
MySQLとPostgreSQLと
日本語全文検索
来年2月9日(肉の日)
DMM.comラボにて

More Related Content

What's hot

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Kouhei Sutou
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムKouhei Sutou
 
RubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りRubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Kouhei Sutou
 
Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29kenhys
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでKouhei Sutou
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアKouhei Sutou
 
Grafana Dashboards as Code
Grafana Dashboards as CodeGrafana Dashboards as Code
Grafana Dashboards as CodeTakuhiro Yoshida
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyDaisuke Ando
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察貴仁 大和屋
 
Groonga改良型Ngramトークナイザー
Groonga改良型NgramトークナイザーGroonga改良型Ngramトークナイザー
Groonga改良型NgramトークナイザーNaoya Murakami
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことMasahiko Sawada
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Daisuke Kikuchi
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeToshi Harada
 
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみようMichio Kataoka
 

What's hot (20)

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
RubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りRubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入り
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!
 
Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject Introspectionで
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェア
 
Grafana Dashboards as Code
Grafana Dashboards as CodeGrafana Dashboards as Code
Grafana Dashboards as Code
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+Groovy
 
Ingress on GKE/GCE
Ingress on GKE/GCEIngress on GKE/GCE
Ingress on GKE/GCE
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
Groonga改良型Ngramトークナイザー
Groonga改良型NgramトークナイザーGroonga改良型Ngramトークナイザー
Groonga改良型Ngramトークナイザー
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいこと
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう
180421第8回関西DB勉強会- たまにはpgAdmin4も使ってみよう
 

Viewers also liked

三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数firewood
 
MySQLを通じた全文検索エンジンSenna/groongaの利用について
MySQLを通じた全文検索エンジンSenna/groongaの利用についてMySQLを通じた全文検索エンジンSenna/groongaの利用について
MySQLを通じた全文検索エンジンSenna/groongaの利用についてTasuku Suenaga
 
Mysql+Mroongaで全文検索
Mysql+Mroongaで全文検索Mysql+Mroongaで全文検索
Mysql+Mroongaで全文検索yoyamasaki
 
全文検索エンジンgroongaの紹介@Solr勉強会
全文検索エンジンgroongaの紹介@Solr勉強会全文検索エンジンgroongaの紹介@Solr勉強会
全文検索エンジンgroongaの紹介@Solr勉強会Tasuku Suenaga
 
Ichii gree-crooz-20120126
Ichii gree-crooz-20120126Ichii gree-crooz-20120126
Ichii gree-crooz-20120126Takashi Ichii
 
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessElasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessShinsuke Sugaya
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Yohei Yasukawa
 

Viewers also liked (8)

三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数
 
MySQLを通じた全文検索エンジンSenna/groongaの利用について
MySQLを通じた全文検索エンジンSenna/groongaの利用についてMySQLを通じた全文検索エンジンSenna/groongaの利用について
MySQLを通じた全文検索エンジンSenna/groongaの利用について
 
全文検索エンジンMroonga_エンジニア勉強会20140418
全文検索エンジンMroonga_エンジニア勉強会20140418全文検索エンジンMroonga_エンジニア勉強会20140418
全文検索エンジンMroonga_エンジニア勉強会20140418
 
Mysql+Mroongaで全文検索
Mysql+Mroongaで全文検索Mysql+Mroongaで全文検索
Mysql+Mroongaで全文検索
 
全文検索エンジンgroongaの紹介@Solr勉強会
全文検索エンジンgroongaの紹介@Solr勉強会全文検索エンジンgroongaの紹介@Solr勉強会
全文検索エンジンgroongaの紹介@Solr勉強会
 
Ichii gree-crooz-20120126
Ichii gree-crooz-20120126Ichii gree-crooz-20120126
Ichii gree-crooz-20120126
 
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessElasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFess
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
 

Similar to Groonga族2015

プログラマー
プログラマープログラマー
プログラマーKouhei Sutou
 
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込みKouhei Sutou
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
DroongaのはじめかたKouhei Sutou
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?Kouhei Sutou
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2Yasukazu Kawasaki
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitSeiya Mizuno
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要Kouhei Sutou
 
ニコニコニュースと全文検索
ニコニコニュースと全文検索ニコニコニュースと全文検索
ニコニコニュースと全文検索techtalkdwango
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニングKiyokazu Kaba
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyoShuyo Nakatani
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法Takuma Watabiki
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29kenhys
 
Groongaの可変型Ngramトークナイザーについて
Groongaの可変型NgramトークナイザーについてGroongaの可変型Ngramトークナイザーについて
Groongaの可変型NgramトークナイザーについてNaoya Murakami
 
Google Cloud AI の紹介 @ GCPUG Nara #03
Google Cloud AI の紹介 @ GCPUG Nara #03Google Cloud AI の紹介 @ GCPUG Nara #03
Google Cloud AI の紹介 @ GCPUG Nara #03Yaboo Oyabu
 
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Tsuyoshi Yamamoto
 

Similar to Groonga族2015 (20)

プログラマー
プログラマープログラマー
プログラマー
 
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
Droongaのはじめかた
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
 
HerokuでGroonga
HerokuでGroongaHerokuでGroonga
HerokuでGroonga
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
Groongaの特徴
Groongaの特徴Groongaの特徴
Groongaの特徴
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要
 
ニコニコニュースと全文検索
ニコニコニュースと全文検索ニコニコニュースと全文検索
ニコニコニュースと全文検索
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
 
システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法システム開発を前進させるためのGradle導入法
システム開発を前進させるためのGradle導入法
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29
 
Groongaの可変型Ngramトークナイザーについて
Groongaの可変型NgramトークナイザーについてGroongaの可変型Ngramトークナイザーについて
Groongaの可変型Ngramトークナイザーについて
 
Google Cloud AI の紹介 @ GCPUG Nara #03
Google Cloud AI の紹介 @ GCPUG Nara #03Google Cloud AI の紹介 @ GCPUG Nara #03
Google Cloud AI の紹介 @ GCPUG Nara #03
 
Google Product
Google ProductGoogle Product
Google Product
 
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
 

More from Kouhei Sutou

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowKouhei Sutou
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowKouhei Sutou
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかKouhei Sutou
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像Kouhei Sutou
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataKouhei Sutou
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Kouhei Sutou
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!Kouhei Sutou
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionKouhei Sutou
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!Kouhei Sutou
 
株式会社クリアコード
株式会社クリアコード株式会社クリアコード
株式会社クリアコードKouhei Sutou
 

More from Kouhei Sutou (20)

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extension
 
PGroonga & Zulip
PGroonga & ZulipPGroonga & Zulip
PGroonga & Zulip
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!
 
株式会社クリアコード
株式会社クリアコード株式会社クリアコード
株式会社クリアコード
 

Groonga族2015

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