Rabbit Slide Show

Groonga族2016

2017-02-09

Description

Groonga、Mroonga、PGroongaなど、Groonga関連プロジェクトの概要と2016年現在の最新情報を紹介します。

Text

Page: 1

Groonga族
2016
須藤功平
株式会社クリアコード
Groonga Meatup 2017
2017-02-09
Groonga族2016
Powered by Rabbit 2.2.1

Page: 2

最近のニュース(1)
Groonga 7.0.0
リリース!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 3

最近のニュース(2)
Mroonga 7.00
リリース!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 4

最近のニュース(3)
MySQL Workbench
Mroongaを
サポート!
(Oracle製のGUIなMySQL管理ツール)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 5

最近のニュース(4)
Zulip
PGroongaを
サポート!
(Dropbox製のチャットツール)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 6

2016年の概要
Groongaが凄くよくなった
速くもなったし便利にもなった
Mroongaはそこそこ
でもGroongaがよくなったので
Mroongaもよくなった
PGroongaも凄くよくなった
Groonga族2016
Powered by Rabbit 2.2.1

Page: 7

最新情報:Groonga
ぐるんが
Groonga族2016
Powered by Rabbit 2.2.1

Page: 8

Groonga: 1
索引指定の
等価検索を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 9

索引指定
column == 29
# ↑Groongaが適切な索引を選んで使用
Numbers.index == 29
# ↑指定した索引で検索
Groonga族2016
Powered by Rabbit 2.2.1

Page: 10

Groonga: 2
シーケンシャル
サーチの
パフォーマンス
向上
(索引なしでも速くなる)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 11

向上パターン
true
# ↑定数
x == 29
# ↑定数値との二項演算
Groonga族2016
Powered by Rabbit 2.2.1

Page: 12

Groonga: 3
config_*
コマンドを追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 13

config_*コマンド
DB全体で使える
キー・バリュー・ストア
config_set:設定
config_get:取得
config_delete:削除
http://groonga.org/ja/docs/
reference/configuration.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 14

用途例
エイリアス情報を格納する
テーブル名の指定
プラグインの設定
例:クエリー展開辞書のパス指定
例:ステミングの言語指定
Groonga族2016
Powered by Rabbit 2.2.1

Page: 15

Groonga: 4
エイリアス
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 16

エイリアス
同一テーブル・カラムに
複数の名前でアクセス
例:tags/TagsどちらでもOK
http://groonga.org/ja/docs/
reference/alias.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 17

用途例
既存クライアントを変更せずに
テーブル・カラムの名前を変更
古いテーブルを削除→
古い名前で新しいテーブルを参照
ダウンタイムなしで
カラムの型を変更
変更後にエイリアスを切り替え
Groonga族2016
Powered by Rabbit 2.2.1

Page: 18

使い方:設定
# Aliasesテーブルのキーを別名、
# real_nameカラムを実名とする
config_set \
alias.column \
Aliases.real_name
Groonga族2016
Powered by Rabbit 2.2.1

Page: 19

使い方:登録
table_create Aliases \
TABLE_HASH_KEY ShortText
column_create Aliases real_name \
COLUMN_SCALAR ShortText
# Users.ageをUsers.yearsに展開
load --table Aliases
[
{"_key": "Users.age",
"real_name": "Users.years"}
]
Groonga族2016
Powered by Rabbit 2.2.1

Page: 20

エイリアスの解決
再帰的
Users.age→
Users.years→
People.years
もアリ
Groonga族2016
Powered by Rabbit 2.2.1

Page: 21

Groonga: 5
lock_*
コマンドを追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 22

lock_*コマンド
lock_acquire:取得
lock_release:解放
Groonga族2016
Powered by Rabbit 2.2.1

Page: 23

用途
テスト
Groonga族2016
Powered by Rabbit 2.2.1

Page: 24

Groonga: 6
あいまい検索
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 25

あいまい検索
多少表記が違ってもマッチ
索引を使うので高速
@naoa_y作
http://blog.createfield.com/
entry/2016/02/28/014432
Groonga族2016
Powered by Rabbit 2.2.1

Page: 26

用途例
名前・住所の検索
表記が揺れやすい
オートコンプリート
ユーザーの入力はミスが多め
Groonga族2016
Powered by Rabbit 2.2.1

Page: 27

使い方:準備
# パトリシアトライなら
# 索引なしでキーをあいまい検索できる
table_create Products TABLE_PAT_KEY ShortText
load --table Products
[
{"_key": "Groonga"},
{"_key": "Grooonga"},
{"_key": "Mroonga"}
]
Groonga族2016
Powered by Rabbit 2.2.1

Page: 28

使い方:検索
select Products \
--filter 'fuzzy_search(_key, "Groonga")' \
--output_columns '_key, _score'
# ... 一致しているほど_scoreが高い ...
# ["Groonga", 2],
# ["Grooonga", 1], 多少違ってもヒット
# ["Mroonga", 1]
多少違ってもヒット
# ...
Groonga族2016
Powered by Rabbit 2.2.1

Page: 29

Groonga: 7
object_inspect
コマンドを追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 30

object_inspect
テーブル・カラムの情報を返す
レコード数とか総キーサイズとか
用途:調査
http://groonga.org/ja/docs/
reference/commands/
object_inspect.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 31

Groonga: 8
ベクターの
指定位置要素の
索引検索を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 32

例
# agesの1番目の要素が29未満ならヒット
# agesの0番目の要素が29未満でも関係ない
ages[1] < 29
Groonga族2016
Powered by Rabbit 2.2.1

Page: 33

使い方:索引
table_create Teams TABLE_NO_KEY
column_create Teams ages \
COLUMN_VECTOR UInt8
table_create Ages TABLE_PAT_KEY
# 索引にはWITH_POSITIONを指定すること!
column_create Ages teams_age \
COLUMN_INDEX|WITH_POSITION Teams age
Groonga族2016
Powered by Rabbit 2.2.1

Page: 34

使い方:検索
load --table Teams
[
{"ages": [ 1, 30, 2]},
{"ages": [30, 28, 29]}
]
select Teams --filter 'ages[1] < 29'
# "ages": [ 1, 30, 2]はヒットしない
# "ages": [30, 28, 29]だけヒット
Groonga族2016
Powered by Rabbit 2.2.1

Page: 35

Groonga: 9
object_remove
コマンドを追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 36

object_remove
テーブル・カラム…を削除
壊れていても強制削除可!
要注意コマンド
用途:障害対応
http://groonga.org/ja/docs/
reference/commands/
object_remove.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 37

Groonga: 10
クエリー最適化
Groonga族2016
Powered by Rabbit 2.2.1

Page: 38

AND+非等価→AND NOT+等価
# 最適化前(索引を使えない)
XXX && column != xxx
# 最適化後(索引を使える)
XXX &! column == xxx
Groonga族2016
Powered by Rabbit 2.2.1

Page: 39

Groonga: 11
Memcached
プロトコルでの
カラム値の
取得・更新を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 40

使い方:スキーマ
# テーブルのキーはShortText
table_create Memos \
TABLE_HASH_KEY ShortText
# カラムはスカラーでText
# (ShortText/LongTextも可)
column_create Memos content \
COLUMN_SCALAR Text
Groonga族2016
Powered by Rabbit 2.2.1

Page: 41

使い方:サーバー
# Memcachedプロトコルで
# Memos.contentにアクセス
% groonga \
--protocol memcached \
--port 11211 \
--memcached-column Memos.content \
-s db
Groonga族2016
Powered by Rabbit 2.2.1

Page: 42

使い方:クライアント
import bmemcached
servers = ("127.0.0.1:11211",)
client = bmemcached.Client(servers)
print(client.get("abc")) # None
client.set("abc", "Hello")
print(client.get("abc")) # "Hello"
Groonga族2016
Powered by Rabbit 2.2.1

Page: 43

使い方:確認
% groonga db select Memos
# {"_key":
"abc",
# キー
# "content": "Hello", # バリュー
# ...他にいくつかメタデータ...}
Groonga族2016
Powered by Rabbit 2.2.1

Page: 44

用途例
永続化対応キーバリューストア
頻繁な参照・更新処理の高速化
HTTPより速い
索引は更新される
→更新したデータはHTTPで全文検索
Groonga族2016
Powered by Rabbit 2.2.1

Page: 45

参考:hog
GroongaベースのKVS
by @takiuchi
既存DBのカラムを読み書き
--protocol memcachedと同様
↑より軽そうで機能が多い
独自プロトコル
https://github.com/genki/hog
Groonga族2016
Powered by Rabbit 2.2.1

Page: 46

Groonga: 12
ハッシュ
テーブルの
最大
総キーサイズUP
4GiB→1TiB
Groonga族2016
Powered by Rabbit 2.2.1

Page: 47

使い方
# デフォルトは4GiBのまま
# KEY_LARGE指定で1TiBに
table_create \
--name Large \
--flags TABLE_HASH_KEY|KEY_LARGE \
--key_type ShortText
Groonga族2016
Powered by Rabbit 2.2.1

Page: 48

Groonga: 13
即
シャットダウン
機能
Groonga族2016
Powered by Rabbit 2.2.1

Page: 49

使い方
# デフォルトは処理中の接続が
# 終わってからシャットダウン
# immediate:処理中の接続が
# あってもすぐにシャットダウン
shutdown --mode immediate
Groonga族2016
Powered by Rabbit 2.2.1

Page: 50

用途例
Windowsシャットダウン時
指定時間内に終了しないと強制終了
強制終了するとDB破損の可能性アリ
強制終了よりimmediateの方がマシ
(Windowsには指定時間を伸ばすAPIアリ)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 51

Groonga: 14
依存テーブル
依存カラムも
一緒に
テーブル削除
Groonga族2016
Powered by Rabbit 2.2.1

Page: 52

対象例
table_create Numbers \
TABLE_PAT_KEY Int64
table_create IDs \
TABLE_HASH_KEY Numbers
# ↑IDsはNumbersを参照
table_remove Numbers
# ↑Numbersは参照されている→エラー
Groonga族2016
Powered by Rabbit 2.2.1

Page: 53

使い方
# --dependent yesを指定
# デフォルトはno
table_remove Numbers \
--dependent yes
# IDsも一緒に削除
http://groonga.org/ja/docs/reference/
commands/table_remove.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 54

Groonga: 15
HTTPでの
タイムアウト
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 55

タイムアウト
タイムアウトなし
→クライアント側で切断
切断後もサーバーのCPUは空かない
タイムアウトあり
→サーバー側で中断
サーバーのCPUが空く
Groonga族2016
Powered by Rabbit 2.2.1

Page: 56

使い方
# 2.9秒で完了しなかったら
# 408 Request Timeoutを返す
/d/select.json?...&
request_timeout=2.9
http://groonga.org/ja/docs/reference/
command/request_timeout.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 57

Groonga: 16
多段
ドリルダウン
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 58

多段ドリルダウン
ドリルダウン結果を
ドリルダウン
利用例:大中小分類それぞれのヒッ
ト件数を1リクエストで集計
データを正規化できる
データの更新に強い
@naoa_y作
Groonga族2016
Powered by Rabbit 2.2.1

Page: 59

イメージ
商品
テーブル
ThinkPad E470
ThinkPad E570
VAIO C15
Nexus 7
小分類
テーブル
2ドア冷蔵庫
3ドア冷蔵庫
ThinkPad
Let's NOTE
VAIO
Nexus
小分類で
ドリルダウン
ThinkPad( 2件)
VAIO( 1件)
Nexus( 1件)
Groonga族2016
中分類
テーブル
冷蔵庫
洗濯機
ノートPC
タブレット
中分類で
ドリルダウン
大分類
テーブル
家電
コンピューター
大分類で
ドリルダウン
ノートPC( 3件)
コンピューター(4件)
タブレット( 1件)
Powered by Rabbit 2.2.1

Page: 60

使い方
select Items \
--drilldowns[s].keys category \ # 小分類でドリルダウン
--drilldowns[s].output_columns _key,medium,_nsubrecs \
--drilldowns[m].table s \
# 小分類でのドリルダウン結果を
--drilldowns[m].keys medium \
# 中分類でドリルダウン
--drilldowns[m].calc_target _nsubrecs \
--drilldowns[m].calc_types SUM \ # 件数(_nsubrecs)を合計
--drilldowns[m].output_columns _key,large,_sum \
--drilldowns[l].table m \
# 中分類でのドリルダウン結果を
--drilldowns[l].keys large \
# 大分類でドリルダウン
--drilldowns[l].calc_target _sum \
--drilldowns[l].calc_types SUM \ # 合計(_sum)をさらに合計
--drilldowns[l].output_columns _key,large,_sum
Groonga族2016
Powered by Rabbit 2.2.1

Page: 61

Groonga: 17
ウィンドウ関数
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 62

ウィンドウ関数
1. グループ毎に処理
普通の関数は1レコード毎に処理
ドリルダウンは全レコードを処理
2. 指定したソート順で処理
Groonga族2016
Powered by Rabbit 2.2.1

Page: 63

用途例
データ分析
例:
商品毎(商品でグループ化)の
売上累計(日付でソート)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 64

商品毎の売上累計
商品 金額
A 100
B 150
A 120
A 130
B 110
日
2/1
2/1
2/2
2/3
2/3
100
150
120
130
110
商品毎の
売上累計
100
150
220
350
260
商品で
日付で
グループ化 ソートして
累積
Groonga族2016
Powered by Rabbit 2.2.1

Page: 65

使い方
select Logs \
# 商品毎の累計売上はamount一時カラムに入れる
--columns[amount].stage initial \
--columns[amount].type UInt32 \
# window_sum()は累計するウィンドウ関数
--columns[amount].value 'window_sum(sales)' \
# 製品でグループ化
--columns[amount].window.group_keys product \
# 日付でソートした順に処理
--columns[amount].window.sort_keys day \
--output_columns *,amount # 出力
Groonga族2016
Powered by Rabbit 2.2.1

Page: 66

Groonga: 18
スライス
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 67

スライス
OLAPの用語
豆知識:ドリルダウンもOLAPの用語
軸を1つ決めて絞り込む
例:
全期間中今年のログだけに着目
「今年」という軸で絞り込んでいる
https://en.wikipedia.org/wiki/
OLAP_cube
Groonga族2016
Powered by Rabbit 2.2.1

Page: 68

スライスのイメージ
CC BY-SA 3.0 by Infopedian
https://commons.wikimedia.org/wiki/
File:OLAP_slicing.png
Groonga族2016
Powered by Rabbit 2.2.1

Page: 69

用途例
1リクエストで
オススメ絞り込み結果も表示
「Webアプリ」の仕事の検索結果(29件)
1.
2.
3.
4.
…
ECサイト開発(PHP)
SNS開発(Ruby)
社内ポータル開発(Java)
検索サイト開発(Ruby)
「Webアプリ」
での検索結果
Groonga族2016
オススメはRuby! (5件)
1. SNS開発
2. 検索サイト開発
…
さらに「Ruby」
で絞り込み
スライス
Powered by Rabbit 2.2.1

Page: 70

使い方
select Works \
--match_columns description \
--query Webアプリ \
# ↑までが通常の検索
# ↓で追加の絞り込み
--slices[ruby].filter language:Ruby
Groonga族2016
Powered by Rabbit 2.2.1

Page: 71

Groonga: 20
数値・時間の
分類関数を
追加
(分類関数という言い回しはよくない気がする)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 72

分類関数
値をグループ化
例:100-199は100、200-299は200
例:2017年1月も2017年2月も2017年
Groonga族2016
Powered by Rabbit 2.2.1

Page: 73

用途例
価格帯でのドリルダウン
年や月でのドリルダウン
Groonga族2016
Powered by Rabbit 2.2.1

Page: 74

使い方
select Logs \
--columns[year].stage filtered \
--columns[year].type UInt16 \
--columns[year].flags COLUMN_SCALAR \
--columns[year].value \
'time_classify_year(timestamp)' \
--output_columns timestamp,year
# yearカラムに年だけが入っている
Groonga族2016
Powered by Rabbit 2.2.1

Page: 75

Groonga: 21
コマンド
バージョン3
追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 76

コマンドバージョン3
レスポンスのフォーマット変更
配列→オブジェクト
デフォルトは1のまま
Groonga族2016
Powered by Rabbit 2.2.1

Page: 77

出力例
status --command_version 3
# {
# "header": {
#
"return_code": 0,
#
"start_time": 1486275098.294436,
#
"elapsed_time": 0.00002,
# },
# "body": {
#
"alloc_count": 275,
#
...
# }
# }
Groonga族2016
Powered by Rabbit 2.2.1

Page: 78

Groonga: 22
query_expand
コマンドを追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 79

query_expandコマンド
クエリー展開結果を返す
同義語の確認に便利
Groonga族2016
Powered by Rabbit 2.2.1

Page: 80

使用例:準備
table_create Words TABLE_HASH_KEY ShortText
# 類義語のリスト
column_create Words synonyms \
COLUMN_VECTOR ShortText
# 「焼肉」は「焼き肉」とも書かれる
load --table Words
[
{"_key": "焼肉",
"synonyms": ["焼肉", "焼き肉"]}
]
Groonga族2016
Powered by Rabbit 2.2.1

Page: 81

使用例:展開
query_expand Words.synonyms 焼肉
# "((焼肉) OR (焼き肉))"
# ↑「焼肉」で検索すると
# 「焼肉」と「焼き肉」のORで検索
Groonga族2016
Powered by Rabbit 2.2.1

Page: 82

Groonga: 23
デフォルトの
ロック
タイムアウト
短縮
Groonga族2016
Powered by Rabbit 2.2.1

Page: 83

ロックタイムアウト
ロック獲得を諦めるまでの時間
2.7時間→15分
クラッシュによるロック残留に
気づくまでの時間が短くなった
Groonga族2016
Powered by Rabbit 2.2.1

Page: 84

Groonga: 24
テーブルの
最大レコード数
更新
Groonga族2016
Powered by Rabbit 2.2.1

Page: 85

最大レコード数
28
従来:2 -1(約2億7千万件)
新:
NO_KEY, PAT_KEY: 約10億件
HASH_KEY: 約5億件
DAT_KEY: 約2億7千万件
Groonga族2016
Powered by Rabbit 2.2.1

Page: 86

Groonga: 25
Zstandard
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 87

Zstandard
新しい圧縮ライブラリー
zlib並の圧縮率
zlibの数倍の速度
カラム値の圧縮に利用可能
Groonga族2016
Powered by Rabbit 2.2.1

Page: 88

使い方
table_create Memos \
TABLE_HASH_KEY ShortText
# COMPRESS_ZSTDを指定するだけ
column_create Memos content \
COLUMN_SCALAR|COMPRESS_ZSTD \
Text
Groonga族2016
Powered by Rabbit 2.2.1

Page: 89

Groonga: 26
選択的
カラム圧縮
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 90

選択的カラム圧縮
小さなデータの圧縮は無意味
ヘッダーの追加でむしろ大きくなる
ムダにリソースを使う
ある程度大きなデータだけ圧縮
257バイト以上のデータのみ圧縮
→カジュアルに圧縮指定できる!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 91

Groonga: 27
loadコマンドが
レコードIDの
返却を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 92

loadコマンド
バルクロード用コマンド
何件ロードしたかだけ返す
ロードしたレコードのIDは返さない
1件のみロードしたい時に不便
追加したらIDを知りたい!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 93

使い方
# _keyは数値
table_create Numbers TABLE_HASH_KEY Int32
# --output_ids yesと--command_version 3の指定が必要!
load --table Numbers \
--output_ids yes --command_version 3
[
{"_key": 29},
# OK
{"_key": "Hello"} # NG
]
# "body": {
#
"loaded_ids": [1, 0]
# }
Groonga族2016
Powered by Rabbit 2.2.1

Page: 94

Groonga: 28
loadコマンドが
エラー情報の
返却を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 95

loadコマンド
バルクロード用コマンド
エラーはログに記録のみ
バッチのときは妥当な挙動
インタラクティブなとき
ログ確認は不便
エラーをすぐに確認したい!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 96

使い方
# --output_errors yesと--command_version 3の指定が必要!
load --table Numbers \
--output_errors yes --command_version 3
[
{"_key": 29},
# OK
{"_key": "Hello"} # NG
]
# "body": {
#
"errors": [
#
{"return_code": 0, "message": null},
#
{"return_code": -22, "message": "failed to..."}
#
]
# }
Groonga族2016
Powered by Rabbit 2.2.1

Page: 97

Groonga: 29
速くなった!
検索も!
更新も!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 98

高速化
検索
AND検索の高速化 by @naoa_y
(10%-40%高速化)
フレーズ検索の高速化 by @naoa_y
(0%-100%高速化)
更新
非自然言語の索引更新性能劣化解消
(分単位→ミリ秒単位)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 99

Groonga: まとめ
便利になって
速くもなった
Groonga族2016
Powered by Rabbit 2.2.1

Page: 100

最新情報:Mroonga
むるんが
Groonga族2016
Powered by Rabbit 2.2.1

Page: 101

Mroonga: おしらせ
初心者向けの電子書籍ができた!
https://grnbook-ja.tumblr.com/
by @KitaitiMakoto
Groonga族2016
Powered by Rabbit 2.2.1

Page: 102

Mroonga: 1
mroonga_
normalize
UDFを追加
UDF: User Defined Function
Groonga族2016
Powered by Rabbit 2.2.1

Page: 103

mroonga_normalize
正規化した文字列を返す
全文検索索引以外でも使える
Groonga族2016
Powered by Rabbit 2.2.1

Page: 104

使い方
SELECT mroonga_normalize('アバ🍣㌠');
-- +------------------------------------+
-- | mroonga_normalize('アバ?㌠')
|
-- +------------------------------------+
-- | アバ🍣サンチーム
|
-- +------------------------------------+
-- 半角カタカナ→全角カタカナ(濁点含む)
-- 絵文字→そのまま
-- 合成済み文字(?)→展開
Groonga族2016
Powered by Rabbit 2.2.1

Page: 105

Mroonga: 2
*SSプラグマ追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 106

*SSプラグマ
SELECT ...
WHERE
MATCH (title)
-- Groongaの検索条件を↓で使える
AGAINST ('*SS ...'
IN BOOLEAN MODE);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 107

Groongaの検索条件
豊富な検索処理
例:あいまい検索
複数の索引で検索可→速い!
MySQLは1つしか使えない
書式:http://groonga.org/ja/docs/
reference/grn_expr/
script_syntax.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 108

Mroonga: 3
mroonga_
snippet_html
UDFが便利に
Groonga族2016
Powered by Rabbit 2.2.1

Page: 109

mroonga_snippet_html
SELECT
mroonga_snippet_html(content,
'+肉 -魚 +野菜' AS query)
-- クエリーをそのまま指定できる↑
-- (肉、野菜は対象。魚は非対象。)
-- 「AS query」がポイント
...
WHERE
MATCH (content)
AGAINST ('+肉 -魚 +野菜' IN BOOLEAN MODE);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 110

Mroonga: 4
マルチバイトな
カラム名を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 111

使い方:定義
CREATE TABLE メモ (
内容 text,
FULLTEXT INDEX (内容)
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
Groonga族2016
Powered by Rabbit 2.2.1

Page: 112

使い方:確認
INSERT INTO メモ
VALUES ('むるんがは速い!');
SELECT * FROM メモ WHERE
MATCH (内容)
AGAINST ('+速い' IN BOOLEAN MODE);
-- +--------------------------+
-- | 内容
|
-- +--------------------------+
-- | むるんがは速い!
|
-- +--------------------------+
Groonga族2016
Powered by Rabbit 2.2.1

Page: 113

Mroonga: 5
FOREIGN KEY制約
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 114

FOREIGN KEY制約
INSERT
存在しない参照の挿入はエラー
UPDATE
被参照レコードの更新はエラー
DELETE
被参照レコードの削除はエラー
Groonga族2016
Powered by Rabbit 2.2.1

Page: 115

使い方:定義
CREATE TABLE tags (
name VARCHAR(128) PRIMARY KEY
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
CREATE TABLE memos (
tag VARCHAR(128),
FOREIGN KEY (tag) REFERENCES tags (name)
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
Groonga族2016
Powered by Rabbit 2.2.1

Page: 116

使い方:INSERT
INSERT INTO memos VALUES ('Mroonga');
-- ↑はエラー:ERROR 1452 (23000):
-- Cannot add or update a child row:
-- a foreign key constraint fails
-- (foreign record doesn't exist:
-- <tag>:<"Mroonga">)
INSERT INTO tags VALUES ('Mroonga');
INSERT INTO memos VALUES ('Mroonga');
-- ↑タグ追加後は成功
-- Query OK, 1 row affected (0.00 sec)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 117

使い方:UPDATE
UPDATE memos SET tag = 'MySQL';
-- ↑はエラー:ERROR 1452 (23000):
-- Cannot add or update a child row:
-- a foreign key constraint fails
-- (foreign record doesn't exist:
-- <tag>:<"MySQL">)
INSERT INTO tags VALUES ('MySQL');
UPDATE memos SET tag = 'MySQL';
-- ↑タグ追加後は成功
-- Query OK, 1 row affected (0.00 sec)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 118

使い方:DELETE
DELETE FROM tags WHERE name = 'MySQL';
-- ↑参照されているタグは消せない
-- ERROR 1451 (23000):
-- Cannot delete or update a parent row:
-- a foreign key constraint fails
-- (one or more child rows exist in <memos>)
DELETE FROM tags WHERE name = 'Mroonga';
-- ↑参照されていないタグは消せる
-- Query OK, 1 row affected (0.00 sec)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 119

Mroonga: 6
最新
MySQL・MariaDB
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 120

サポートバージョン
MySQL: 5.7.17
8.0.0は未確認
MariaDB: 10.2.3
Groonga族2016
Powered by Rabbit 2.2.1

Page: 121

Mroonga: 7
マルチカラム
インデックスの
性能劣化解消
Groonga族2016
Powered by Rabbit 2.2.1

Page: 122

性能劣化
マルチカラムインデックス
キー:非自然言語
→Groongaが苦手なパターンだった
Groonga側の改良で解消
Groonga族2016
Powered by Rabbit 2.2.1

Page: 123

Mroonga: まとめ
便利になった!
速くもなった!
Groongaが速くなったから
Groonga族2016
Powered by Rabbit 2.2.1

Page: 124

最新情報:PGroonga
ぴーじーるんが
Groonga族2016
Powered by Rabbit 2.2.1

Page: 125

PGroonga: 1
TABLESPACE
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 126

TABLESPACE
別のパスにファイルを置く機能
使用例:索引はSSDに置く
https://www.postgresql.org/docs/
current/static/manage-ag-
tablespaces.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 127

使い方
-- SSDを使うテーブルスペースを作成
CREATE TABLESPACE ssd
LOCATION '/ssd/data';
CREATE TABLE memos (
content text
); -- テーブルはHDDに置く
CREATE INDEX content_search
ON memos
USING pgroonga (content)
TABLESPACE ssd; -- 索引はSSDに置く
Groonga族2016
Powered by Rabbit 2.2.1

Page: 128

PGroonga: 2
複合主キー
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 129

複合主キー
複数のカラムで主キーを構成
pgroonga.scoreを使うには
主キーが必要
複合主キーでもpgroonga.scoreを使
えるようになった
Groonga族2016
Powered by Rabbit 2.2.1

Page: 130

使い方:複合主キー定義
CREATE TABLE items (
company_id int,
product_id int,
description text,
-- 会社IDと製品IDを合わせて主キー
PRIMARY KEY (company_id, product_id)
);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 131

使い方:索引定義
CREATE INDEX description_search
ON items
-- 複合主キーの全カラムを含める
USING pgroonga (company_id,
product_id,
description);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 132

使い方:検索
-- 索引を使わないとスコアは常に0になる
SET enable_seqscan = 'no';
SELECT description, pgroonga.score(items)
FROM items
WHERE description @@ 'すごい';
-- description | score
-- -------------+-------
-- すごい!
|
1 ← 0じゃない!
-- (1 row)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 133

PGroonga: 3
マルチバイトな
カラム名を
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 134

マルチバイトなカラム名
例:日本語のカラム名
制限:UTF-8のみサポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 135

使い方
-- 日本語テーブル名
CREATE TABLE メモ (
内容 text -- 日本語カラム名
);
CREATE INDEX 内容検索
ON メモ
USING pgroonga (内容);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 136

PGroonga: 4
類似文書検索
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 137

使い方:定義
CREATE TABLE memos (content text);
CREATE INDEX content_search
ON memos
USING pgroonga (
content
-- v2オペレータークラスを指定
pgroonga.text_full_text_search_ops_v2
) -- 形態素解析ベースのトークナイザーを指定
WITH (tokenizer='TokenMecab');
Groonga族2016
Powered by Rabbit 2.2.1

Page: 138

使い方:検索
INSERT INTO memos VALUES
('全文検索が速い'),
('更新が速い'),
('集計が速い');
SELECT * FROM memos
-- 類似文書検索用演算子は「&~?」
WHERE content &~? '全文検索どう?';
--
content
-- ----------------
-- 全文検索が速い
-- (1 row)
-- ↑同じ話題。「どう?」は含んでいない。
Groonga族2016
Powered by Rabbit 2.2.1

Page: 139

PGroonga: 5
前方一致検索
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 140

使い方:定義
-- タグをヨミガナで検索
CREATE TABLE tags (reading text);
CREATE INDEX reading_search
ON tags
USING pgroonga (
reading
-- ↓のオペレータークラスを指定
pgroonga.text_term_search_ops_v2
);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 141

使い方:検索
INSERT INTO tags VALUES
('ゼンブンケンサク'),
('ゼンポウイッチ'),
('シュウケイ');
SELECT * FROM tags
-- 前方一致用演算子は「&^」
WHERE reading &^ 'ゼン';
--
reading
-- ------------------
-- ゼンブンケンサク
-- ゼンポウイッチ
Groonga族2016
Powered by Rabbit 2.2.1

Page: 142

PGroonga: 6
前方一致RK検索
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 143

RK:ローマ字・カナ
ローマ字(zen)で
カナ(ゼンブンケンサク)を
前方一致検索
= 前方一致RK検索
用途:入力補完
Groonga族2016
Powered by Rabbit 2.2.1

Page: 144

使い方:検索
-- データは前方一致検索と同じ
SELECT * FROM tags
-- 前方一致RK用演算子は「&^~」
-- 「ゼン」でも「ぜん」でも同じ結果
WHERE reading &^~ 'zen';
--
reading
-- ------------------
-- ゼンブンケンサク
-- ゼンポウイッチ
Groonga族2016
Powered by Rabbit 2.2.1

Page: 145

PGroonga: 7
pgroonga.
highlight_html
追加
Groonga族2016
Powered by Rabbit 2.2.1

Page: 146

pgroonga.highlight_html
キーワードをハイライト
用途:検索結果の表示
Groonga族2016
Powered by Rabbit 2.2.1

Page: 147

使い方:基本
SELECT pgroonga.highlight_html(
'Groongaは速い',
-- ハイライト対象
ARRAY['Groonga']); -- キーワードは複数指定可
--
highlight_html
-- --------------------------------------------
-- <span class="keyword">Groonga</span>は速い
-- (1 row)
-- ↑キーワードは<span>で囲まれる。
Groonga族2016
Powered by Rabbit 2.2.1

Page: 148

使い方:応用
SELECT pgroonga.highlight_html(
'Groongaは速い',
-- ハイライト対象
-- クエリーからキーワードを抽出
pgroonga.query_extract_keywords(
'Groonga OR PostgreSQL')
);
--
highlight_html
-- --------------------------------------------
-- <span class="keyword">Groonga</span>は速い
-- (1 row)
-- ↑キーワードは<span>で囲まれる。
Groonga族2016
Powered by Rabbit 2.2.1

Page: 149

PGroonga: 8
ヒット件数の
見積サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 150

ヒット件数の見積
実行計画決定に利用
見積精度が上がると
適切な計画を選びやすくなる
→速くなる!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 151

PGroonga: 9
ストリーミング
レプリ
ケーション
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 152

レプリケーション
リアルタイムでデータコピー
用途例:検索性能向上
検索性能が足りない!
→検索専用ノード追加で対応
https://pgroonga.github.io/ja/
reference/replication.html
Groonga族2016
Powered by Rabbit 2.2.1

Page: 153

PGroonga: 10
Zstandard
サポート
Groonga族2016
Powered by Rabbit 2.2.1

Page: 154

使い方
ユーザーはなにもしなくてよい
PGroongaが自動で使う
テキストカラムで利用
Groonga族2016
Powered by Rabbit 2.2.1

Page: 155

PGroonga: 11
生Groonga検索
サポート強化
Groonga族2016
Powered by Rabbit 2.2.1

Page: 156

生Groonga検索
PostgreSQLを介さずに
Groongaで検索
pgroonga.commandを使う
課題:セキュリティー
インジェクション怖い…
Groonga族2016
Powered by Rabbit 2.2.1

Page: 157

セキュリティー対策
自動エスケープ
Groonga族2016
Powered by Rabbit 2.2.1

Page: 158

使い方
SELECT pgroonga.command(
'select',
ARRAY[ -- 配列で渡すと自動エスケープ
'table', pgroonga.table_name('memos'),
-- ..., ↓自動エスケープ
'query', 'ユーザーからの入力'
]);
Groonga族2016
Powered by Rabbit 2.2.1

Page: 159

PGroonga: まとめ
便利になった!
速くもなった!
Groongaが速くなったから
Groonga族2016
Powered by Rabbit 2.2.1

Page: 160

2016年のまとめ
Groongaが凄くよくなった
速くもなったし便利にもなった
Mroongaの本ができた
https://grnbook-ja.tumblr.com/
by @KitaitiMakoto
PGroongaも凄くよくなった
Groonga族2016
Powered by Rabbit 2.2.1

Page: 161

2017年の抱負
データ分析に
活用したい!
Groonga族2016
Powered by Rabbit 2.2.1

Page: 162

データ分析に活用?
分析システムの一部でGroonga
特徴を活かせるのでは!?
Groongaの特徴
リアルタイムな自然言語処理
高速なフィルター・集計処理
データの前処理・選別にどう?
(一緒に活用方法から考えていきたい!)
Groonga族2016
Powered by Rabbit 2.2.1

Page: 163

データ分析への最初の一歩
Cythonでバインディングを開発
Pythonで使えると分析システムで
使いやすいかも?
興味がある人たちで集まる
手を動かす人たちがよさそう?
Groonga族2016
Powered by Rabbit 2.2.1

Other slides

Mroonga!
2015-10-30