SlideShare a Scribd company logo
1 of 163
Download to read offline
Groonga族2016 Powered by Rabbit 2.2.1
Groonga族
2016
須藤功平 株式会社クリアコード
Groonga Meatup 2017
2017-02-09
Groonga族2016 Powered by Rabbit 2.2.1
最近のニュース(1)
Groonga 7.0.0
リリース!
Groonga族2016 Powered by Rabbit 2.2.1
最近のニュース(2)
Mroonga 7.00
リリース!
Groonga族2016 Powered by Rabbit 2.2.1
最近のニュース(3)
MySQL Workbench(Oracle製のGUIなMySQL管理ツール)
Mroongaを
サポート!
Groonga族2016 Powered by Rabbit 2.2.1
最近のニュース(4)
Zulip(Dropbox製のチャットツール)
PGroongaを
サポート!
Groonga族2016 Powered by Rabbit 2.2.1
2016年の概要
Groongaが凄くよくなった
速くもなったし便利にもなった
Mroongaはそこそこ
でもGroongaがよくなったので
Mroongaもよくなった
PGroongaも凄くよくなった
Groonga族2016 Powered by Rabbit 2.2.1
最新情報:Groonga
ぐるんが
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 1
索引指定の
等価検索を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
索引指定
column == 29
# ↑Groongaが適切な索引を選んで使用
Numbers.index == 29
# ↑指定した索引で検索
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 2
シーケンシャル
サーチの
パフォーマンス
向上(索引なしでも速くなる)
Groonga族2016 Powered by Rabbit 2.2.1
向上パターン
true
# ↑定数
x == 29
# ↑定数値との二項演算
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 3
config_*
コマンドを追加
Groonga族2016 Powered by Rabbit 2.2.1
config_*コマンド
DB全体で使える
キー・バリュー・ストア
config_set:設定
config_get:取得
config_delete:削除
http://groonga.org/ja/docs/
reference/configuration.html
Groonga族2016 Powered by Rabbit 2.2.1
用途例
エイリアス情報を格納する
テーブル名の指定
プラグインの設定
例:クエリー展開辞書のパス指定
例:ステミングの言語指定
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 4
エイリアス
サポート
Groonga族2016 Powered by Rabbit 2.2.1
エイリアス
同一テーブル・カラムに
複数の名前でアクセス
例:tags/TagsどちらでもOK
http://groonga.org/ja/docs/
reference/alias.html
Groonga族2016 Powered by Rabbit 2.2.1
用途例
既存クライアントを変更せずに
テーブル・カラムの名前を変更
古いテーブルを削除→
古い名前で新しいテーブルを参照
ダウンタイムなしで
カラムの型を変更
変更後にエイリアスを切り替え
Groonga族2016 Powered by Rabbit 2.2.1
使い方:設定
# Aliasesテーブルのキーを別名、
# real_nameカラムを実名とする
config_set 
alias.column 
Aliases.real_name
Groonga族2016 Powered by Rabbit 2.2.1
使い方:登録
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
エイリアスの解決
再帰的
Users.age→
Users.years→
People.years
もアリ
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 5
lock_*
コマンドを追加
Groonga族2016 Powered by Rabbit 2.2.1
lock_*コマンド
lock_acquire:取得
lock_release:解放
Groonga族2016 Powered by Rabbit 2.2.1
用途
テスト
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 6
あいまい検索
サポート
Groonga族2016 Powered by Rabbit 2.2.1
あいまい検索
多少表記が違ってもマッチ
索引を使うので高速
@naoa_y作
http://blog.createfield.com/
entry/2016/02/28/014432
Groonga族2016 Powered by Rabbit 2.2.1
用途例
名前・住所の検索
表記が揺れやすい
オートコンプリート
ユーザーの入力はミスが多め
Groonga族2016 Powered by Rabbit 2.2.1
使い方:準備
# パトリシアトライなら
# 索引なしでキーをあいまい検索できる
table_create Products TABLE_PAT_KEY ShortText
load --table Products
[
{"_key": "Groonga"},
{"_key": "Grooonga"},
{"_key": "Mroonga"}
]
Groonga族2016 Powered by Rabbit 2.2.1
使い方:検索
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
Groonga: 7
object_inspect
コマンドを追加
Groonga族2016 Powered by Rabbit 2.2.1
object_inspect
テーブル・カラムの情報を返す
レコード数とか総キーサイズとか
用途:調査
http://groonga.org/ja/docs/
reference/commands/
object_inspect.html
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 8
ベクターの
指定位置要素の
索引検索を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
例
# agesの1番目の要素が29未満ならヒット
# agesの0番目の要素が29未満でも関係ない
ages[1] < 29
Groonga族2016 Powered by Rabbit 2.2.1
使い方:索引
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
使い方:検索
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
Groonga: 9
object_remove
コマンドを追加
Groonga族2016 Powered by Rabbit 2.2.1
object_remove
テーブル・カラム…を削除
壊れていても強制削除可!
要注意コマンド
用途:障害対応
http://groonga.org/ja/docs/
reference/commands/
object_remove.html
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 10
クエリー最適化
Groonga族2016 Powered by Rabbit 2.2.1
AND+非等価→AND NOT+等価
# 最適化前(索引を使えない)
XXX && column != xxx
# 最適化後(索引を使える)
XXX &! column == xxx
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 11
Memcached
プロトコルでの
カラム値の
取得・更新を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方:スキーマ
# テーブルのキーは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
使い方:サーバー
# Memcachedプロトコルで
# Memos.contentにアクセス
% groonga 
--protocol memcached 
--port 11211 
--memcached-column Memos.content 
-s db
Groonga族2016 Powered by Rabbit 2.2.1
使い方:クライアント
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
使い方:確認
% groonga db select Memos
# {"_key": "abc", # キー
# "content": "Hello", # バリュー
# ...他にいくつかメタデータ...}
Groonga族2016 Powered by Rabbit 2.2.1
用途例
永続化対応キーバリューストア
頻繁な参照・更新処理の高速化
HTTPより速い
索引は更新される
→更新したデータはHTTPで全文検索
Groonga族2016 Powered by Rabbit 2.2.1
参考:hog
GroongaベースのKVS
by @takiuchi
既存DBのカラムを読み書き
--protocol memcachedと同様
↑より軽そうで機能が多い
独自プロトコル
https://github.com/genki/hog
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 12
ハッシュ
テーブルの
最大
総キーサイズUP
4GiB→1TiB
Groonga族2016 Powered by Rabbit 2.2.1
使い方
# デフォルトは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
Groonga: 13
即
シャットダウン
機能
Groonga族2016 Powered by Rabbit 2.2.1
使い方
# デフォルトは処理中の接続が
# 終わってからシャットダウン
# immediate:処理中の接続が
# あってもすぐにシャットダウン
shutdown --mode immediate
Groonga族2016 Powered by Rabbit 2.2.1
用途例
Windowsシャットダウン時
指定時間内に終了しないと強制終了
強制終了するとDB破損の可能性アリ
強制終了よりimmediateの方がマシ
(Windowsには指定時間を伸ばすAPIアリ)
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 14
依存テーブル
依存カラムも
一緒に
テーブル削除
Groonga族2016 Powered by Rabbit 2.2.1
対象例
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
使い方
# --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
Groonga: 15
HTTPでの
タイムアウト
サポート
Groonga族2016 Powered by Rabbit 2.2.1
タイムアウト
タイムアウトなし
→クライアント側で切断
切断後もサーバーのCPUは空かない
タイムアウトあり
→サーバー側で中断
サーバーのCPUが空く
Groonga族2016 Powered by Rabbit 2.2.1
使い方
# 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
Groonga: 16
多段
ドリルダウン
サポート
Groonga族2016 Powered by Rabbit 2.2.1
多段ドリルダウン
ドリルダウン結果を
ドリルダウン
利用例:大中小分類それぞれのヒッ
ト件数を1リクエストで集計
データを正規化できる
データの更新に強い
@naoa_y作
Groonga族2016 Powered by Rabbit 2.2.1
イメージ
小分類
テーブル
中分類
テーブル
大分類
テーブル
家電
コンピューター
冷蔵庫
洗濯機
ノートPC
タブレット
2ドア冷蔵庫
3ドア冷蔵庫
ThinkPad
Let's NOTE
VAIO
Nexus
商品
テーブル
ThinkPad E470
ThinkPad E570
VAIO C15
Nexus 7
小分類で
ドリルダウン
ThinkPad(2件)
VAIO(1件)
Nexus(1件)
ノートPC(3件)
タブレット(1件)
コンピューター(4件)
中分類で
ドリルダウン
大分類で
ドリルダウン
Groonga族2016 Powered by Rabbit 2.2.1
使い方
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
Groonga: 17
ウィンドウ関数
サポート
Groonga族2016 Powered by Rabbit 2.2.1
ウィンドウ関数
グループ毎に処理
普通の関数は1レコード毎に処理
ドリルダウンは全レコードを処理
1.
指定したソート順で処理2.
Groonga族2016 Powered by Rabbit 2.2.1
用途例
データ分析
例:
商品毎(商品でグループ化)の
売上累計(日付でソート)
Groonga族2016 Powered by Rabbit 2.2.1
商品毎の売上累計
商品 金額 日
A
B
A
A
B
100
150
120
130
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
使い方
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
Groonga: 18
スライス
サポート
Groonga族2016 Powered by Rabbit 2.2.1
スライス
OLAPの用語
豆知識:ドリルダウンもOLAPの用語
軸を1つ決めて絞り込む
例:
全期間中今年のログだけに着目
「今年」という軸で絞り込んでいる
https://en.wikipedia.org/wiki/
OLAP_cube
Groonga族2016 Powered by Rabbit 2.2.1
スライスのイメージ
CC BY-SA 3.0 by Infopedian
https://commons.wikimedia.org/wiki/
File:OLAP_slicing.png
Groonga族2016 Powered by Rabbit 2.2.1
用途例
1リクエストで
オススメ絞り込み結果も表示
「Webアプリ」の仕事の検索結果(29件)
1. ECサイト開発(PHP)
2. SNS開発(Ruby)
3. 社内ポータル開発(Java)
4. 検索サイト開発(Ruby)
…
オススメはRuby!
1. SNS開発
2. 検索サイト開発
…
「Webアプリ」
での検索結果
さらに「Ruby」
で絞り込み
(5件)
スライス
Groonga族2016 Powered by Rabbit 2.2.1
使い方
select Works 
--match_columns description 
--query Webアプリ 
# ↑までが通常の検索
# ↓で追加の絞り込み
--slices[ruby].filter language:Ruby
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 20
数値・時間の
分類関数を
追加(分類関数という言い回しはよくない気がする)
Groonga族2016 Powered by Rabbit 2.2.1
分類関数
値をグループ化
例:100-199は100、200-299は200
例:2017年1月も2017年2月も2017年
Groonga族2016 Powered by Rabbit 2.2.1
用途例
価格帯でのドリルダウン
年や月でのドリルダウン
Groonga族2016 Powered by Rabbit 2.2.1
使い方
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
Groonga: 21
コマンド
バージョン3
追加
Groonga族2016 Powered by Rabbit 2.2.1
コマンドバージョン3
レスポンスのフォーマット変更
配列→オブジェクト
デフォルトは1のまま
Groonga族2016 Powered by Rabbit 2.2.1
出力例
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
Groonga: 22
query_expand
コマンドを追加
Groonga族2016 Powered by Rabbit 2.2.1
query_expandコマンド
クエリー展開結果を返す
同義語の確認に便利
Groonga族2016 Powered by Rabbit 2.2.1
使用例:準備
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
使用例:展開
query_expand Words.synonyms 焼肉
# "((焼肉) OR (焼き肉))"
# ↑「焼肉」で検索すると
# 「焼肉」と「焼き肉」のORで検索
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 23
デフォルトの
ロック
タイムアウト
短縮
Groonga族2016 Powered by Rabbit 2.2.1
ロックタイムアウト
ロック獲得を諦めるまでの時間
2.7時間→15分
クラッシュによるロック残留に
気づくまでの時間が短くなった
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 24
テーブルの
最大レコード数
更新
Groonga族2016 Powered by Rabbit 2.2.1
最大レコード数
従来:2
28
-1(約2億7千万件)
新:
NO_KEY, PAT_KEY: 約10億件
HASH_KEY: 約5億件
DAT_KEY: 約2億7千万件
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 25
Zstandard
サポート
Groonga族2016 Powered by Rabbit 2.2.1
Zstandard
新しい圧縮ライブラリー
zlib並の圧縮率
zlibの数倍の速度
カラム値の圧縮に利用可能
Groonga族2016 Powered by Rabbit 2.2.1
使い方
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
Groonga: 26
選択的
カラム圧縮
サポート
Groonga族2016 Powered by Rabbit 2.2.1
選択的カラム圧縮
小さなデータの圧縮は無意味
ヘッダーの追加でむしろ大きくなる
ムダにリソースを使う
ある程度大きなデータだけ圧縮
257バイト以上のデータのみ圧縮
→カジュアルに圧縮指定できる!
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: 27
loadコマンドが
レコードIDの
返却を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
loadコマンド
バルクロード用コマンド
何件ロードしたかだけ返す
ロードしたレコードのIDは返さない
1件のみロードしたい時に不便
追加したらIDを知りたい!
Groonga族2016 Powered by Rabbit 2.2.1
使い方
# _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
Groonga: 28
loadコマンドが
エラー情報の
返却を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
loadコマンド
バルクロード用コマンド
エラーはログに記録のみ
バッチのときは妥当な挙動
インタラクティブなとき
ログ確認は不便
エラーをすぐに確認したい!
Groonga族2016 Powered by Rabbit 2.2.1
使い方
# --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
Groonga: 29
速くなった!
検索も!
更新も!
Groonga族2016 Powered by Rabbit 2.2.1
高速化
検索
AND検索の高速化 by @naoa_y
(10%-40%高速化)
フレーズ検索の高速化 by @naoa_y
(0%-100%高速化)
更新
非自然言語の索引更新性能劣化解消
(分単位→ミリ秒単位)
Groonga族2016 Powered by Rabbit 2.2.1
Groonga: まとめ
便利になって
速くもなった
Groonga族2016 Powered by Rabbit 2.2.1
最新情報:Mroonga
むるんが
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: おしらせ
初心者向けの電子書籍ができた!
https://grnbook-ja.tumblr.com/
by @KitaitiMakoto
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: 1
mroonga_
normalize
UDFを追加UDF: User Defined Function
Groonga族2016 Powered by Rabbit 2.2.1
mroonga_normalize
正規化した文字列を返す
全文検索索引以外でも使える
Groonga族2016 Powered by Rabbit 2.2.1
使い方
SELECT mroonga_normalize('アバ🍣㌠');
-- +------------------------------------+
-- | mroonga_normalize('アバ?㌠') |
-- +------------------------------------+
-- | アバ🍣サンチーム |
-- +------------------------------------+
-- 半角カタカナ→全角カタカナ(濁点含む)
-- 絵文字→そのまま
-- 合成済み文字(?)→展開
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: 2
*SSプラグマ追加
Groonga族2016 Powered by Rabbit 2.2.1
*SSプラグマ
SELECT ...
WHERE
MATCH (title)
-- Groongaの検索条件を↓で使える
AGAINST ('*SS ...'
IN BOOLEAN MODE);
Groonga族2016 Powered by Rabbit 2.2.1
Groongaの検索条件
豊富な検索処理
例:あいまい検索
複数の索引で検索可→速い!
MySQLは1つしか使えない
書式:http://groonga.org/ja/docs/
reference/grn_expr/
script_syntax.html
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: 3
mroonga_
snippet_html
UDFが便利に
Groonga族2016 Powered by Rabbit 2.2.1
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
Mroonga: 4
マルチバイトな
カラム名を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方:定義
CREATE TABLE メモ (
内容 text,
FULLTEXT INDEX (内容)
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
Groonga族2016 Powered by Rabbit 2.2.1
使い方:確認
INSERT INTO メモ
VALUES ('むるんがは速い!');
SELECT * FROM メモ WHERE
MATCH (内容)
AGAINST ('+速い' IN BOOLEAN MODE);
-- +--------------------------+
-- | 内容 |
-- +--------------------------+
-- | むるんがは速い! |
-- +--------------------------+
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: 5
FOREIGN KEY制約
サポート
Groonga族2016 Powered by Rabbit 2.2.1
FOREIGN KEY制約
INSERT
存在しない参照の挿入はエラー
UPDATE
被参照レコードの更新はエラー
DELETE
被参照レコードの削除はエラー
Groonga族2016 Powered by Rabbit 2.2.1
使い方:定義
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
使い方: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
使い方: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
使い方: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
Mroonga: 6
最新
MySQL・MariaDB
サポート
Groonga族2016 Powered by Rabbit 2.2.1
サポートバージョン
MySQL: 5.7.17
8.0.0は未確認
MariaDB: 10.2.3
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: 7
マルチカラム
インデックスの
性能劣化解消
Groonga族2016 Powered by Rabbit 2.2.1
性能劣化
マルチカラムインデックス
キー:非自然言語
→Groongaが苦手なパターンだった
Groonga側の改良で解消
Groonga族2016 Powered by Rabbit 2.2.1
Mroonga: まとめ
便利になった!
速くもなった!
Groongaが速くなったから
Groonga族2016 Powered by Rabbit 2.2.1
最新情報:PGroonga
ぴーじーるんが
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 1
TABLESPACE
サポート
Groonga族2016 Powered by Rabbit 2.2.1
TABLESPACE
別のパスにファイルを置く機能
使用例:索引はSSDに置く
https://www.postgresql.org/docs/
current/static/manage-ag-
tablespaces.html
Groonga族2016 Powered by Rabbit 2.2.1
使い方
-- 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
PGroonga: 2
複合主キー
サポート
Groonga族2016 Powered by Rabbit 2.2.1
複合主キー
複数のカラムで主キーを構成
pgroonga.scoreを使うには
主キーが必要
複合主キーでもpgroonga.scoreを使
えるようになった
Groonga族2016 Powered by Rabbit 2.2.1
使い方:複合主キー定義
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
使い方:索引定義
CREATE INDEX description_search
ON items
-- 複合主キーの全カラムを含める
USING pgroonga (company_id,
product_id,
description);
Groonga族2016 Powered by Rabbit 2.2.1
使い方:検索
-- 索引を使わないとスコアは常に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
PGroonga: 3
マルチバイトな
カラム名を
サポート
Groonga族2016 Powered by Rabbit 2.2.1
マルチバイトなカラム名
例:日本語のカラム名
制限:UTF-8のみサポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方
-- 日本語テーブル名
CREATE TABLE メモ (
内容 text -- 日本語カラム名
);
CREATE INDEX 内容検索
ON メモ
USING pgroonga (内容);
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 4
類似文書検索
サポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方:定義
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
使い方:検索
INSERT INTO memos VALUES
('全文検索が速い'),
('更新が速い'),
('集計が速い');
SELECT * FROM memos
-- 類似文書検索用演算子は「&~?」
WHERE content &~? '全文検索どう?';
-- content
-- ----------------
-- 全文検索が速い
-- (1 row)
-- ↑同じ話題。「どう?」は含んでいない。
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 5
前方一致検索
サポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方:定義
-- タグをヨミガナで検索
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
使い方:検索
INSERT INTO tags VALUES
('ゼンブンケンサク'),
('ゼンポウイッチ'),
('シュウケイ');
SELECT * FROM tags
-- 前方一致用演算子は「&^」
WHERE reading &^ 'ゼン';
-- reading
-- ------------------
-- ゼンブンケンサク
-- ゼンポウイッチ
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 6
前方一致RK検索
サポート
Groonga族2016 Powered by Rabbit 2.2.1
RK:ローマ字・カナ
ローマ字(zen)で
カナ(ゼンブンケンサク)を
前方一致検索
= 前方一致RK検索
用途:入力補完
Groonga族2016 Powered by Rabbit 2.2.1
使い方:検索
-- データは前方一致検索と同じ
SELECT * FROM tags
-- 前方一致RK用演算子は「&^~」
-- 「ゼン」でも「ぜん」でも同じ結果
WHERE reading &^~ 'zen';
-- reading
-- ------------------
-- ゼンブンケンサク
-- ゼンポウイッチ
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 7
pgroonga.
highlight_html
追加
Groonga族2016 Powered by Rabbit 2.2.1
pgroonga.highlight_html
キーワードをハイライト
用途:検索結果の表示
Groonga族2016 Powered by Rabbit 2.2.1
使い方:基本
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
使い方:応用
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
PGroonga: 8
ヒット件数の
見積サポート
Groonga族2016 Powered by Rabbit 2.2.1
ヒット件数の見積
実行計画決定に利用
見積精度が上がると
適切な計画を選びやすくなる
→速くなる!
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 9
ストリーミング
レプリ
ケーション
サポート
Groonga族2016 Powered by Rabbit 2.2.1
レプリケーション
リアルタイムでデータコピー
用途例:検索性能向上
検索性能が足りない!
→検索専用ノード追加で対応
https://pgroonga.github.io/ja/
reference/replication.html
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 10
Zstandard
サポート
Groonga族2016 Powered by Rabbit 2.2.1
使い方
ユーザーはなにもしなくてよい
PGroongaが自動で使う
テキストカラムで利用
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: 11
生Groonga検索
サポート強化
Groonga族2016 Powered by Rabbit 2.2.1
生Groonga検索
PostgreSQLを介さずに
Groongaで検索
pgroonga.commandを使う
課題:セキュリティー
インジェクション怖い…
Groonga族2016 Powered by Rabbit 2.2.1
セキュリティー対策
自動エスケープ
Groonga族2016 Powered by Rabbit 2.2.1
使い方
SELECT pgroonga.command(
'select',
ARRAY[ -- 配列で渡すと自動エスケープ
'table', pgroonga.table_name('memos'),
-- ..., ↓自動エスケープ
'query', 'ユーザーからの入力'
]);
Groonga族2016 Powered by Rabbit 2.2.1
PGroonga: まとめ
便利になった!
速くもなった!
Groongaが速くなったから
Groonga族2016 Powered by Rabbit 2.2.1
2016年のまとめ
Groongaが凄くよくなった
速くもなったし便利にもなった
Mroongaの本ができた
https://grnbook-ja.tumblr.com/
by @KitaitiMakoto
PGroongaも凄くよくなった
Groonga族2016 Powered by Rabbit 2.2.1
2017年の抱負
データ分析に
活用したい!
Groonga族2016 Powered by Rabbit 2.2.1
データ分析に活用?
分析システムの一部でGroonga
特徴を活かせるのでは!?
Groongaの特徴
リアルタイムな自然言語処理
高速なフィルター・集計処理
データの前処理・選別にどう?
(一緒に活用方法から考えていきたい!)
Groonga族2016 Powered by Rabbit 2.2.1
データ分析への最初の一歩
Cythonでバインディングを開発
Pythonで使えると分析システムで
使いやすいかも?
興味がある人たちで集まる
手を動かす人たちがよさそう?

More Related Content

What's hot

MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーKouhei Sutou
 
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムPostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムKouhei Sutou
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Hiroshi Yuki
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Kouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
はじめてのDroonga
はじめてのDroongaはじめてのDroonga
はじめてのDroongaHiroshi Yuki
 
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~Recruit Technologies
 
20131230_CloudStack Advent Calendar VPCを作ってみよう
20131230_CloudStack Advent Calendar VPCを作ってみよう20131230_CloudStack Advent Calendar VPCを作ってみよう
20131230_CloudStack Advent Calendar VPCを作ってみようMidori Oge
 
Challengers 2013 winter ハッカソンに参加してみて
Challengers 2013 winter ハッカソンに参加してみてChallengers 2013 winter ハッカソンに参加してみて
Challengers 2013 winter ハッカソンに参加してみてYukio Saito
 
PRMU201902 Presentation document
PRMU201902 Presentation documentPRMU201902 Presentation document
PRMU201902 Presentation documentMasayuki Tanaka
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!Kouhei Sutou
 
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月VirtualTech Japan Inc.
 

What's hot (18)

MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
 
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムPostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
はじめてのDroonga
はじめてのDroongaはじめてのDroonga
はじめてのDroonga
 
文字化け
文字化け文字化け
文字化け
 
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
 
20131230_CloudStack Advent Calendar VPCを作ってみよう
20131230_CloudStack Advent Calendar VPCを作ってみよう20131230_CloudStack Advent Calendar VPCを作ってみよう
20131230_CloudStack Advent Calendar VPCを作ってみよう
 
Challengers 2013 winter ハッカソンに参加してみて
Challengers 2013 winter ハッカソンに参加してみてChallengers 2013 winter ハッカソンに参加してみて
Challengers 2013 winter ハッカソンに参加してみて
 
PRMU201902 Presentation document
PRMU201902 Presentation documentPRMU201902 Presentation document
PRMU201902 Presentation document
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!
 
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
OpenStack管理者入門 - OpenStack最新情報セミナー 2014年12月
 

Similar to Groonga族2016

Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
DroongaのはじめかたKouhei Sutou
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29kenhys
 
Groongaを支える取り組み
Groongaを支える取り組みGroongaを支える取り組み
Groongaを支える取り組みkenhys
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
Droonga移行後の世界
Droonga移行後の世界Droonga移行後の世界
Droonga移行後の世界Kouhei Sutou
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンYasuaki Matsuda
 
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interfaceMasahito Zembutsu
 
Rancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタRancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタTakashi Kanai
 
Go で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみたGo で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみたftnk
 
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションKubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションTakashi Kanai
 
はてなのNagios - モニカジ#3
はてなのNagios - モニカジ#3はてなのNagios - モニカジ#3
はてなのNagios - モニカジ#3Shoichi Masuhara
 
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使うMasashi Shinbara
 
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込みKouhei Sutou
 
Gangliaはじめました
GangliaはじめましたGangliaはじめました
Gangliaはじめましたyuzorock
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Uehara Junji
 
Versatil Javaチューニング
Versatil JavaチューニングVersatil Javaチューニング
Versatil JavaチューニングKenji Kazumura
 
Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Tetsurou Yano
 

Similar to Groonga族2016 (20)

Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
Droongaのはじめかた
 
Groongaの特徴
Groongaの特徴Groongaの特徴
Groongaの特徴
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29
 
Groongaを支える取り組み
Groongaを支える取り組みGroongaを支える取り組み
Groongaを支える取り組み
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
Droonga移行後の世界
Droonga移行後の世界Droonga移行後の世界
Droonga移行後の世界
 
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオンAzure のポータル画面で、AI フレーバな BOT の作成ハンズオン
Azure のポータル画面で、AI フレーバな BOT の作成ハンズオン
 
Start-padrino
Start-padrinoStart-padrino
Start-padrino
 
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interface
 
Rancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタRancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタ
 
Go で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみたGo で Munin プラグインを書いてみた
Go で Munin プラグインを書いてみた
 
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションKubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
 
はてなのNagios - モニカジ#3
はてなのNagios - モニカジ#3はてなのNagios - モニカジ#3
はてなのNagios - モニカジ#3
 
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
 
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
第7回フクオカRuby大賞本審査資料:全文検索エンジンGroongaへのmrubyの組み込み
 
Gangliaはじめました
GangliaはじめましたGangliaはじめました
Gangliaはじめました
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 
Versatil Javaチューニング
Versatil JavaチューニングVersatil Javaチューニング
Versatil Javaチューニング
 
Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由
 
Maatkitの紹介
Maatkitの紹介Maatkitの紹介
Maatkitの紹介
 

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族2016

  • 1. Groonga族2016 Powered by Rabbit 2.2.1 Groonga族 2016 須藤功平 株式会社クリアコード Groonga Meatup 2017 2017-02-09
  • 2. Groonga族2016 Powered by Rabbit 2.2.1 最近のニュース(1) Groonga 7.0.0 リリース!
  • 3. Groonga族2016 Powered by Rabbit 2.2.1 最近のニュース(2) Mroonga 7.00 リリース!
  • 4. Groonga族2016 Powered by Rabbit 2.2.1 最近のニュース(3) MySQL Workbench(Oracle製のGUIなMySQL管理ツール) Mroongaを サポート!
  • 5. Groonga族2016 Powered by Rabbit 2.2.1 最近のニュース(4) Zulip(Dropbox製のチャットツール) PGroongaを サポート!
  • 6. Groonga族2016 Powered by Rabbit 2.2.1 2016年の概要 Groongaが凄くよくなった 速くもなったし便利にもなった Mroongaはそこそこ でもGroongaがよくなったので Mroongaもよくなった PGroongaも凄くよくなった
  • 7. Groonga族2016 Powered by Rabbit 2.2.1 最新情報:Groonga ぐるんが
  • 8. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 1 索引指定の 等価検索を サポート
  • 9. Groonga族2016 Powered by Rabbit 2.2.1 索引指定 column == 29 # ↑Groongaが適切な索引を選んで使用 Numbers.index == 29 # ↑指定した索引で検索
  • 10. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 2 シーケンシャル サーチの パフォーマンス 向上(索引なしでも速くなる)
  • 11. Groonga族2016 Powered by Rabbit 2.2.1 向上パターン true # ↑定数 x == 29 # ↑定数値との二項演算
  • 12. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 3 config_* コマンドを追加
  • 13. Groonga族2016 Powered by Rabbit 2.2.1 config_*コマンド DB全体で使える キー・バリュー・ストア config_set:設定 config_get:取得 config_delete:削除 http://groonga.org/ja/docs/ reference/configuration.html
  • 14. Groonga族2016 Powered by Rabbit 2.2.1 用途例 エイリアス情報を格納する テーブル名の指定 プラグインの設定 例:クエリー展開辞書のパス指定 例:ステミングの言語指定
  • 15. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 4 エイリアス サポート
  • 16. Groonga族2016 Powered by Rabbit 2.2.1 エイリアス 同一テーブル・カラムに 複数の名前でアクセス 例:tags/TagsどちらでもOK http://groonga.org/ja/docs/ reference/alias.html
  • 17. Groonga族2016 Powered by Rabbit 2.2.1 用途例 既存クライアントを変更せずに テーブル・カラムの名前を変更 古いテーブルを削除→ 古い名前で新しいテーブルを参照 ダウンタイムなしで カラムの型を変更 変更後にエイリアスを切り替え
  • 18. Groonga族2016 Powered by Rabbit 2.2.1 使い方:設定 # Aliasesテーブルのキーを別名、 # real_nameカラムを実名とする config_set alias.column Aliases.real_name
  • 19. Groonga族2016 Powered by Rabbit 2.2.1 使い方:登録 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"} ]
  • 20. Groonga族2016 Powered by Rabbit 2.2.1 エイリアスの解決 再帰的 Users.age→ Users.years→ People.years もアリ
  • 21. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 5 lock_* コマンドを追加
  • 22. Groonga族2016 Powered by Rabbit 2.2.1 lock_*コマンド lock_acquire:取得 lock_release:解放
  • 23. Groonga族2016 Powered by Rabbit 2.2.1 用途 テスト
  • 24. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 6 あいまい検索 サポート
  • 25. Groonga族2016 Powered by Rabbit 2.2.1 あいまい検索 多少表記が違ってもマッチ 索引を使うので高速 @naoa_y作 http://blog.createfield.com/ entry/2016/02/28/014432
  • 26. Groonga族2016 Powered by Rabbit 2.2.1 用途例 名前・住所の検索 表記が揺れやすい オートコンプリート ユーザーの入力はミスが多め
  • 27. Groonga族2016 Powered by Rabbit 2.2.1 使い方:準備 # パトリシアトライなら # 索引なしでキーをあいまい検索できる table_create Products TABLE_PAT_KEY ShortText load --table Products [ {"_key": "Groonga"}, {"_key": "Grooonga"}, {"_key": "Mroonga"} ]
  • 28. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 select Products --filter 'fuzzy_search(_key, "Groonga")' --output_columns '_key, _score' # ... 一致しているほど_scoreが高い ... # ["Groonga", 2], # ["Grooonga", 1], 多少違ってもヒット # ["Mroonga", 1] 多少違ってもヒット # ...
  • 29. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 7 object_inspect コマンドを追加
  • 30. Groonga族2016 Powered by Rabbit 2.2.1 object_inspect テーブル・カラムの情報を返す レコード数とか総キーサイズとか 用途:調査 http://groonga.org/ja/docs/ reference/commands/ object_inspect.html
  • 31. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 8 ベクターの 指定位置要素の 索引検索を サポート
  • 32. Groonga族2016 Powered by Rabbit 2.2.1 例 # agesの1番目の要素が29未満ならヒット # agesの0番目の要素が29未満でも関係ない ages[1] < 29
  • 33. Groonga族2016 Powered by Rabbit 2.2.1 使い方:索引 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
  • 34. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 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]だけヒット
  • 35. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 9 object_remove コマンドを追加
  • 36. Groonga族2016 Powered by Rabbit 2.2.1 object_remove テーブル・カラム…を削除 壊れていても強制削除可! 要注意コマンド 用途:障害対応 http://groonga.org/ja/docs/ reference/commands/ object_remove.html
  • 37. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 10 クエリー最適化
  • 38. Groonga族2016 Powered by Rabbit 2.2.1 AND+非等価→AND NOT+等価 # 最適化前(索引を使えない) XXX && column != xxx # 最適化後(索引を使える) XXX &! column == xxx
  • 39. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 11 Memcached プロトコルでの カラム値の 取得・更新を サポート
  • 40. Groonga族2016 Powered by Rabbit 2.2.1 使い方:スキーマ # テーブルのキーはShortText table_create Memos TABLE_HASH_KEY ShortText # カラムはスカラーでText # (ShortText/LongTextも可) column_create Memos content COLUMN_SCALAR Text
  • 41. Groonga族2016 Powered by Rabbit 2.2.1 使い方:サーバー # Memcachedプロトコルで # Memos.contentにアクセス % groonga --protocol memcached --port 11211 --memcached-column Memos.content -s db
  • 42. Groonga族2016 Powered by Rabbit 2.2.1 使い方:クライアント 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"
  • 43. Groonga族2016 Powered by Rabbit 2.2.1 使い方:確認 % groonga db select Memos # {"_key": "abc", # キー # "content": "Hello", # バリュー # ...他にいくつかメタデータ...}
  • 44. Groonga族2016 Powered by Rabbit 2.2.1 用途例 永続化対応キーバリューストア 頻繁な参照・更新処理の高速化 HTTPより速い 索引は更新される →更新したデータはHTTPで全文検索
  • 45. Groonga族2016 Powered by Rabbit 2.2.1 参考:hog GroongaベースのKVS by @takiuchi 既存DBのカラムを読み書き --protocol memcachedと同様 ↑より軽そうで機能が多い 独自プロトコル https://github.com/genki/hog
  • 46. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 12 ハッシュ テーブルの 最大 総キーサイズUP 4GiB→1TiB
  • 47. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # デフォルトは4GiBのまま # KEY_LARGE指定で1TiBに table_create --name Large --flags TABLE_HASH_KEY|KEY_LARGE --key_type ShortText
  • 48. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 13 即 シャットダウン 機能
  • 49. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # デフォルトは処理中の接続が # 終わってからシャットダウン # immediate:処理中の接続が # あってもすぐにシャットダウン shutdown --mode immediate
  • 50. Groonga族2016 Powered by Rabbit 2.2.1 用途例 Windowsシャットダウン時 指定時間内に終了しないと強制終了 強制終了するとDB破損の可能性アリ 強制終了よりimmediateの方がマシ (Windowsには指定時間を伸ばすAPIアリ)
  • 51. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 14 依存テーブル 依存カラムも 一緒に テーブル削除
  • 52. Groonga族2016 Powered by Rabbit 2.2.1 対象例 table_create Numbers TABLE_PAT_KEY Int64 table_create IDs TABLE_HASH_KEY Numbers # ↑IDsはNumbersを参照 table_remove Numbers # ↑Numbersは参照されている→エラー
  • 53. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # --dependent yesを指定 # デフォルトはno table_remove Numbers --dependent yes # IDsも一緒に削除 http://groonga.org/ja/docs/reference/ commands/table_remove.html
  • 54. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 15 HTTPでの タイムアウト サポート
  • 55. Groonga族2016 Powered by Rabbit 2.2.1 タイムアウト タイムアウトなし →クライアント側で切断 切断後もサーバーのCPUは空かない タイムアウトあり →サーバー側で中断 サーバーのCPUが空く
  • 56. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # 2.9秒で完了しなかったら # 408 Request Timeoutを返す /d/select.json?...& request_timeout=2.9 http://groonga.org/ja/docs/reference/ command/request_timeout.html
  • 57. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 16 多段 ドリルダウン サポート
  • 58. Groonga族2016 Powered by Rabbit 2.2.1 多段ドリルダウン ドリルダウン結果を ドリルダウン 利用例:大中小分類それぞれのヒッ ト件数を1リクエストで集計 データを正規化できる データの更新に強い @naoa_y作
  • 59. Groonga族2016 Powered by Rabbit 2.2.1 イメージ 小分類 テーブル 中分類 テーブル 大分類 テーブル 家電 コンピューター 冷蔵庫 洗濯機 ノートPC タブレット 2ドア冷蔵庫 3ドア冷蔵庫 ThinkPad Let's NOTE VAIO Nexus 商品 テーブル ThinkPad E470 ThinkPad E570 VAIO C15 Nexus 7 小分類で ドリルダウン ThinkPad(2件) VAIO(1件) Nexus(1件) ノートPC(3件) タブレット(1件) コンピューター(4件) 中分類で ドリルダウン 大分類で ドリルダウン
  • 60. Groonga族2016 Powered by Rabbit 2.2.1 使い方 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
  • 61. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 17 ウィンドウ関数 サポート
  • 62. Groonga族2016 Powered by Rabbit 2.2.1 ウィンドウ関数 グループ毎に処理 普通の関数は1レコード毎に処理 ドリルダウンは全レコードを処理 1. 指定したソート順で処理2.
  • 63. Groonga族2016 Powered by Rabbit 2.2.1 用途例 データ分析 例: 商品毎(商品でグループ化)の 売上累計(日付でソート)
  • 64. Groonga族2016 Powered by Rabbit 2.2.1 商品毎の売上累計 商品 金額 日 A B A A B 100 150 120 130 110 2/1 2/1 2/2 2/3 2/3 商品で グループ化 100 150 120 130 110 日付で ソートして 累積 100 150 220 350 260 商品毎の 売上累計
  • 65. Groonga族2016 Powered by Rabbit 2.2.1 使い方 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 # 出力
  • 66. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 18 スライス サポート
  • 67. Groonga族2016 Powered by Rabbit 2.2.1 スライス OLAPの用語 豆知識:ドリルダウンもOLAPの用語 軸を1つ決めて絞り込む 例: 全期間中今年のログだけに着目 「今年」という軸で絞り込んでいる https://en.wikipedia.org/wiki/ OLAP_cube
  • 68. Groonga族2016 Powered by Rabbit 2.2.1 スライスのイメージ CC BY-SA 3.0 by Infopedian https://commons.wikimedia.org/wiki/ File:OLAP_slicing.png
  • 69. Groonga族2016 Powered by Rabbit 2.2.1 用途例 1リクエストで オススメ絞り込み結果も表示 「Webアプリ」の仕事の検索結果(29件) 1. ECサイト開発(PHP) 2. SNS開発(Ruby) 3. 社内ポータル開発(Java) 4. 検索サイト開発(Ruby) … オススメはRuby! 1. SNS開発 2. 検索サイト開発 … 「Webアプリ」 での検索結果 さらに「Ruby」 で絞り込み (5件) スライス
  • 70. Groonga族2016 Powered by Rabbit 2.2.1 使い方 select Works --match_columns description --query Webアプリ # ↑までが通常の検索 # ↓で追加の絞り込み --slices[ruby].filter language:Ruby
  • 71. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 20 数値・時間の 分類関数を 追加(分類関数という言い回しはよくない気がする)
  • 72. Groonga族2016 Powered by Rabbit 2.2.1 分類関数 値をグループ化 例:100-199は100、200-299は200 例:2017年1月も2017年2月も2017年
  • 73. Groonga族2016 Powered by Rabbit 2.2.1 用途例 価格帯でのドリルダウン 年や月でのドリルダウン
  • 74. Groonga族2016 Powered by Rabbit 2.2.1 使い方 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カラムに年だけが入っている
  • 75. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 21 コマンド バージョン3 追加
  • 76. Groonga族2016 Powered by Rabbit 2.2.1 コマンドバージョン3 レスポンスのフォーマット変更 配列→オブジェクト デフォルトは1のまま
  • 77. Groonga族2016 Powered by Rabbit 2.2.1 出力例 status --command_version 3 # { # "header": { # "return_code": 0, # "start_time": 1486275098.294436, # "elapsed_time": 0.00002, # }, # "body": { # "alloc_count": 275, # ... # } # }
  • 78. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 22 query_expand コマンドを追加
  • 79. Groonga族2016 Powered by Rabbit 2.2.1 query_expandコマンド クエリー展開結果を返す 同義語の確認に便利
  • 80. Groonga族2016 Powered by Rabbit 2.2.1 使用例:準備 table_create Words TABLE_HASH_KEY ShortText # 類義語のリスト column_create Words synonyms COLUMN_VECTOR ShortText # 「焼肉」は「焼き肉」とも書かれる load --table Words [ {"_key": "焼肉", "synonyms": ["焼肉", "焼き肉"]} ]
  • 81. Groonga族2016 Powered by Rabbit 2.2.1 使用例:展開 query_expand Words.synonyms 焼肉 # "((焼肉) OR (焼き肉))" # ↑「焼肉」で検索すると # 「焼肉」と「焼き肉」のORで検索
  • 82. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 23 デフォルトの ロック タイムアウト 短縮
  • 83. Groonga族2016 Powered by Rabbit 2.2.1 ロックタイムアウト ロック獲得を諦めるまでの時間 2.7時間→15分 クラッシュによるロック残留に 気づくまでの時間が短くなった
  • 84. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 24 テーブルの 最大レコード数 更新
  • 85. Groonga族2016 Powered by Rabbit 2.2.1 最大レコード数 従来:2 28 -1(約2億7千万件) 新: NO_KEY, PAT_KEY: 約10億件 HASH_KEY: 約5億件 DAT_KEY: 約2億7千万件
  • 86. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 25 Zstandard サポート
  • 87. Groonga族2016 Powered by Rabbit 2.2.1 Zstandard 新しい圧縮ライブラリー zlib並の圧縮率 zlibの数倍の速度 カラム値の圧縮に利用可能
  • 88. Groonga族2016 Powered by Rabbit 2.2.1 使い方 table_create Memos TABLE_HASH_KEY ShortText # COMPRESS_ZSTDを指定するだけ column_create Memos content COLUMN_SCALAR|COMPRESS_ZSTD Text
  • 89. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 26 選択的 カラム圧縮 サポート
  • 90. Groonga族2016 Powered by Rabbit 2.2.1 選択的カラム圧縮 小さなデータの圧縮は無意味 ヘッダーの追加でむしろ大きくなる ムダにリソースを使う ある程度大きなデータだけ圧縮 257バイト以上のデータのみ圧縮 →カジュアルに圧縮指定できる!
  • 91. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 27 loadコマンドが レコードIDの 返却を サポート
  • 92. Groonga族2016 Powered by Rabbit 2.2.1 loadコマンド バルクロード用コマンド 何件ロードしたかだけ返す ロードしたレコードのIDは返さない 1件のみロードしたい時に不便 追加したらIDを知りたい!
  • 93. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # _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] # }
  • 94. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 28 loadコマンドが エラー情報の 返却を サポート
  • 95. Groonga族2016 Powered by Rabbit 2.2.1 loadコマンド バルクロード用コマンド エラーはログに記録のみ バッチのときは妥当な挙動 インタラクティブなとき ログ確認は不便 エラーをすぐに確認したい!
  • 96. Groonga族2016 Powered by Rabbit 2.2.1 使い方 # --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..."} # ] # }
  • 97. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: 29 速くなった! 検索も! 更新も!
  • 98. Groonga族2016 Powered by Rabbit 2.2.1 高速化 検索 AND検索の高速化 by @naoa_y (10%-40%高速化) フレーズ検索の高速化 by @naoa_y (0%-100%高速化) 更新 非自然言語の索引更新性能劣化解消 (分単位→ミリ秒単位)
  • 99. Groonga族2016 Powered by Rabbit 2.2.1 Groonga: まとめ 便利になって 速くもなった
  • 100. Groonga族2016 Powered by Rabbit 2.2.1 最新情報:Mroonga むるんが
  • 101. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: おしらせ 初心者向けの電子書籍ができた! https://grnbook-ja.tumblr.com/ by @KitaitiMakoto
  • 102. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 1 mroonga_ normalize UDFを追加UDF: User Defined Function
  • 103. Groonga族2016 Powered by Rabbit 2.2.1 mroonga_normalize 正規化した文字列を返す 全文検索索引以外でも使える
  • 104. Groonga族2016 Powered by Rabbit 2.2.1 使い方 SELECT mroonga_normalize('アバ🍣㌠'); -- +------------------------------------+ -- | mroonga_normalize('アバ?㌠') | -- +------------------------------------+ -- | アバ🍣サンチーム | -- +------------------------------------+ -- 半角カタカナ→全角カタカナ(濁点含む) -- 絵文字→そのまま -- 合成済み文字(?)→展開
  • 105. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 2 *SSプラグマ追加
  • 106. Groonga族2016 Powered by Rabbit 2.2.1 *SSプラグマ SELECT ... WHERE MATCH (title) -- Groongaの検索条件を↓で使える AGAINST ('*SS ...' IN BOOLEAN MODE);
  • 107. Groonga族2016 Powered by Rabbit 2.2.1 Groongaの検索条件 豊富な検索処理 例:あいまい検索 複数の索引で検索可→速い! MySQLは1つしか使えない 書式:http://groonga.org/ja/docs/ reference/grn_expr/ script_syntax.html
  • 108. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 3 mroonga_ snippet_html UDFが便利に
  • 109. Groonga族2016 Powered by Rabbit 2.2.1 mroonga_snippet_html SELECT mroonga_snippet_html(content, '+肉 -魚 +野菜' AS query) -- クエリーをそのまま指定できる↑ -- (肉、野菜は対象。魚は非対象。) -- 「AS query」がポイント ... WHERE MATCH (content) AGAINST ('+肉 -魚 +野菜' IN BOOLEAN MODE);
  • 110. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 4 マルチバイトな カラム名を サポート
  • 111. Groonga族2016 Powered by Rabbit 2.2.1 使い方:定義 CREATE TABLE メモ ( 内容 text, FULLTEXT INDEX (内容) ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
  • 112. Groonga族2016 Powered by Rabbit 2.2.1 使い方:確認 INSERT INTO メモ VALUES ('むるんがは速い!'); SELECT * FROM メモ WHERE MATCH (内容) AGAINST ('+速い' IN BOOLEAN MODE); -- +--------------------------+ -- | 内容 | -- +--------------------------+ -- | むるんがは速い! | -- +--------------------------+
  • 113. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 5 FOREIGN KEY制約 サポート
  • 114. Groonga族2016 Powered by Rabbit 2.2.1 FOREIGN KEY制約 INSERT 存在しない参照の挿入はエラー UPDATE 被参照レコードの更新はエラー DELETE 被参照レコードの削除はエラー
  • 115. Groonga族2016 Powered by Rabbit 2.2.1 使い方:定義 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;
  • 116. Groonga族2016 Powered by Rabbit 2.2.1 使い方: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)
  • 117. Groonga族2016 Powered by Rabbit 2.2.1 使い方: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)
  • 118. Groonga族2016 Powered by Rabbit 2.2.1 使い方: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)
  • 119. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 6 最新 MySQL・MariaDB サポート
  • 120. Groonga族2016 Powered by Rabbit 2.2.1 サポートバージョン MySQL: 5.7.17 8.0.0は未確認 MariaDB: 10.2.3
  • 121. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: 7 マルチカラム インデックスの 性能劣化解消
  • 122. Groonga族2016 Powered by Rabbit 2.2.1 性能劣化 マルチカラムインデックス キー:非自然言語 →Groongaが苦手なパターンだった Groonga側の改良で解消
  • 123. Groonga族2016 Powered by Rabbit 2.2.1 Mroonga: まとめ 便利になった! 速くもなった! Groongaが速くなったから
  • 124. Groonga族2016 Powered by Rabbit 2.2.1 最新情報:PGroonga ぴーじーるんが
  • 125. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 1 TABLESPACE サポート
  • 126. Groonga族2016 Powered by Rabbit 2.2.1 TABLESPACE 別のパスにファイルを置く機能 使用例:索引はSSDに置く https://www.postgresql.org/docs/ current/static/manage-ag- tablespaces.html
  • 127. Groonga族2016 Powered by Rabbit 2.2.1 使い方 -- 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に置く
  • 128. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 2 複合主キー サポート
  • 129. Groonga族2016 Powered by Rabbit 2.2.1 複合主キー 複数のカラムで主キーを構成 pgroonga.scoreを使うには 主キーが必要 複合主キーでもpgroonga.scoreを使 えるようになった
  • 130. Groonga族2016 Powered by Rabbit 2.2.1 使い方:複合主キー定義 CREATE TABLE items ( company_id int, product_id int, description text, -- 会社IDと製品IDを合わせて主キー PRIMARY KEY (company_id, product_id) );
  • 131. Groonga族2016 Powered by Rabbit 2.2.1 使い方:索引定義 CREATE INDEX description_search ON items -- 複合主キーの全カラムを含める USING pgroonga (company_id, product_id, description);
  • 132. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 -- 索引を使わないとスコアは常に0になる SET enable_seqscan = 'no'; SELECT description, pgroonga.score(items) FROM items WHERE description @@ 'すごい'; -- description | score -- -------------+------- -- すごい! | 1 ← 0じゃない! -- (1 row)
  • 133. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 3 マルチバイトな カラム名を サポート
  • 134. Groonga族2016 Powered by Rabbit 2.2.1 マルチバイトなカラム名 例:日本語のカラム名 制限:UTF-8のみサポート
  • 135. Groonga族2016 Powered by Rabbit 2.2.1 使い方 -- 日本語テーブル名 CREATE TABLE メモ ( 内容 text -- 日本語カラム名 ); CREATE INDEX 内容検索 ON メモ USING pgroonga (内容);
  • 136. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 4 類似文書検索 サポート
  • 137. Groonga族2016 Powered by Rabbit 2.2.1 使い方:定義 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');
  • 138. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 INSERT INTO memos VALUES ('全文検索が速い'), ('更新が速い'), ('集計が速い'); SELECT * FROM memos -- 類似文書検索用演算子は「&~?」 WHERE content &~? '全文検索どう?'; -- content -- ---------------- -- 全文検索が速い -- (1 row) -- ↑同じ話題。「どう?」は含んでいない。
  • 139. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 5 前方一致検索 サポート
  • 140. Groonga族2016 Powered by Rabbit 2.2.1 使い方:定義 -- タグをヨミガナで検索 CREATE TABLE tags (reading text); CREATE INDEX reading_search ON tags USING pgroonga ( reading -- ↓のオペレータークラスを指定 pgroonga.text_term_search_ops_v2 );
  • 141. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 INSERT INTO tags VALUES ('ゼンブンケンサク'), ('ゼンポウイッチ'), ('シュウケイ'); SELECT * FROM tags -- 前方一致用演算子は「&^」 WHERE reading &^ 'ゼン'; -- reading -- ------------------ -- ゼンブンケンサク -- ゼンポウイッチ
  • 142. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 6 前方一致RK検索 サポート
  • 143. Groonga族2016 Powered by Rabbit 2.2.1 RK:ローマ字・カナ ローマ字(zen)で カナ(ゼンブンケンサク)を 前方一致検索 = 前方一致RK検索 用途:入力補完
  • 144. Groonga族2016 Powered by Rabbit 2.2.1 使い方:検索 -- データは前方一致検索と同じ SELECT * FROM tags -- 前方一致RK用演算子は「&^~」 -- 「ゼン」でも「ぜん」でも同じ結果 WHERE reading &^~ 'zen'; -- reading -- ------------------ -- ゼンブンケンサク -- ゼンポウイッチ
  • 145. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 7 pgroonga. highlight_html 追加
  • 146. Groonga族2016 Powered by Rabbit 2.2.1 pgroonga.highlight_html キーワードをハイライト 用途:検索結果の表示
  • 147. Groonga族2016 Powered by Rabbit 2.2.1 使い方:基本 SELECT pgroonga.highlight_html( 'Groongaは速い', -- ハイライト対象 ARRAY['Groonga']); -- キーワードは複数指定可 -- highlight_html -- -------------------------------------------- -- <span class="keyword">Groonga</span>は速い -- (1 row) -- ↑キーワードは<span>で囲まれる。
  • 148. Groonga族2016 Powered by Rabbit 2.2.1 使い方:応用 SELECT pgroonga.highlight_html( 'Groongaは速い', -- ハイライト対象 -- クエリーからキーワードを抽出 pgroonga.query_extract_keywords( 'Groonga OR PostgreSQL') ); -- highlight_html -- -------------------------------------------- -- <span class="keyword">Groonga</span>は速い -- (1 row) -- ↑キーワードは<span>で囲まれる。
  • 149. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 8 ヒット件数の 見積サポート
  • 150. Groonga族2016 Powered by Rabbit 2.2.1 ヒット件数の見積 実行計画決定に利用 見積精度が上がると 適切な計画を選びやすくなる →速くなる!
  • 151. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 9 ストリーミング レプリ ケーション サポート
  • 152. Groonga族2016 Powered by Rabbit 2.2.1 レプリケーション リアルタイムでデータコピー 用途例:検索性能向上 検索性能が足りない! →検索専用ノード追加で対応 https://pgroonga.github.io/ja/ reference/replication.html
  • 153. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 10 Zstandard サポート
  • 154. Groonga族2016 Powered by Rabbit 2.2.1 使い方 ユーザーはなにもしなくてよい PGroongaが自動で使う テキストカラムで利用
  • 155. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: 11 生Groonga検索 サポート強化
  • 156. Groonga族2016 Powered by Rabbit 2.2.1 生Groonga検索 PostgreSQLを介さずに Groongaで検索 pgroonga.commandを使う 課題:セキュリティー インジェクション怖い…
  • 157. Groonga族2016 Powered by Rabbit 2.2.1 セキュリティー対策 自動エスケープ
  • 158. Groonga族2016 Powered by Rabbit 2.2.1 使い方 SELECT pgroonga.command( 'select', ARRAY[ -- 配列で渡すと自動エスケープ 'table', pgroonga.table_name('memos'), -- ..., ↓自動エスケープ 'query', 'ユーザーからの入力' ]);
  • 159. Groonga族2016 Powered by Rabbit 2.2.1 PGroonga: まとめ 便利になった! 速くもなった! Groongaが速くなったから
  • 160. Groonga族2016 Powered by Rabbit 2.2.1 2016年のまとめ Groongaが凄くよくなった 速くもなったし便利にもなった Mroongaの本ができた https://grnbook-ja.tumblr.com/ by @KitaitiMakoto PGroongaも凄くよくなった
  • 161. Groonga族2016 Powered by Rabbit 2.2.1 2017年の抱負 データ分析に 活用したい!
  • 162. Groonga族2016 Powered by Rabbit 2.2.1 データ分析に活用? 分析システムの一部でGroonga 特徴を活かせるのでは!? Groongaの特徴 リアルタイムな自然言語処理 高速なフィルター・集計処理 データの前処理・選別にどう? (一緒に活用方法から考えていきたい!)
  • 163. Groonga族2016 Powered by Rabbit 2.2.1 データ分析への最初の一歩 Cythonでバインディングを開発 Pythonで使えると分析システムで 使いやすいかも? 興味がある人たちで集まる 手を動かす人たちがよさそう?