Droongaのnはじめかた

: author

須藤功平

: institution

クリアコード

: content-source

全文検索エンジンGroonga勉強会@札幌 2014/03/29

: date

2014/03/29

: allotted-time

20m

: theme

groonga

この勉強会とこの話の関連

* 勉強会
  * Groongaの利用事例を募集
* この話
  * Groongaを使ったプロダクト\n
    Droongaの話

お知らせ1

# image
# src = images/groonga-logo.svg
# relative_width = 100

((‘tag:center’))((‘tag:x-large’))4.0.1リリース!

4.0.1の新機能1

* adjuster
  * スコアブースト機能
  * 使用例: 運営のオススメを上に表示
* 重み付きベクター
  * レコード毎にn個の重みを設定
  * adjusterと連携するとよい

4.0.1の新機能2

* データベース肥大化抑制
  * Milkodeユーザーにも効果大なはず
  * 注意: データベースの再作成が必要
  * データベースの後方互換性あり

お知らせ2

# image
# src = images/droonga-logo.svg
# relative_width = 100

((‘tag:center’))((‘tag:x-large’))1.0.1リリース!

1.0.1の新機能

* adjuster対応
* 重み付きベクター対応
* ユーザー視点の使い勝手向上
  * grn2drn-schema, droonga-send, ...

((‘note:今月は開発者としてよりもユーザーとして触っていたから’))

今日の目標

1人以上n Droongaデビュー

話すこと

Droongan 未経験者向けn ヒントn

流れ

* ((*Droongaとはなにか*))
* Groongaの使い方
* ↑とDroongaの使い方の違い
* Droongaの考え方のイメージ

Droongaとはなにか

# image
# src = images/droonga-logo.svg
# relative_width = 100

((‘tag:center’))((D))istributed G((roonga))

Distributed?

スケールアウト可能

Droonga

スケールアウト可能なnGroonga

Groongaが透けて見える

スケールアウト可能なn((Groonga))

GroongaとDroonga

* 一部はGroonga != Droonga
* 一部はGroonga == Droonga

Groonga != Droonga

* APIは違う
  * DroongaにGroonga互換レイヤーあり
* 構成は違う
  * 1台でDroongaを使っても嬉しくない
* 性能特性は違う
  * 1台で捌ける量→Groongaの方が速い

Groonga == Droonga

* クエリーの書き方は同じ
* スキーマの考え方は同じ
* 検索機能はだいたい同じ

Droongaをはじめるために

教養としてn Groongaをn 押さえてn おくべき!

Groongaの使い方

* Droongaとはなにか
* ((*Groongaの使い方*))
* ↑とDroongaの使い方の違い
* Droongaの考え方のイメージ

なぜまずGroongaか

((‘tag:center’))((‘tag:x-large’))((‘tag:margin-bottom’))Groongaはお手軽

* 1台のマシンで動く
* 設定ファイルなしで動く
* コマンドラインで動く

Groongaを使う流れ

((‘tag:center’))((‘note:初心者向けの簡易版’))

(1) ((*スキーマを作る*))
(2) インデックスを作る
(3) データを入れる
(4) 検索する

スキーマを作る

* 検索したいものを((*1つ*))決める
  * 例: たいやき屋検索ならたいやき屋
* 検索したいものの集まりを\n
  テーブルにする
  * 例: TaiyakiShopsテーブル
* 付加情報をカラムにする
  * 例: 店舗名、場所、メニューなど

スキーマ例

table_create TaiyakiShops \
  TABLE_HASH_KEY ShortText
# 店舗名
column_create TaiyakiShops name \
  COLUMN_SCALAR ShortText
# 場所
column_create TaiyakiShops location \
  COLUMN_SCALAR WGS84GeoPoint

Groongaを使う流れ: 2

(1) スキーマを作る
(2) ((*インデックスを作る*))
(3) データを入れる
(4) 検索する

インデックスを作る

* 全文検索対象を決める
  * 例: 店舗名
* トークンの集合を格納する\n
  テーブルを作る
  * トークン: 最小検索単位
* ↑にインデックスカラムを作る

インデックス例

# トークン用テーブル
# 初心者は常にこれでOK
table_create Tokens \
  TABLE_PAT_KEY ShortText \
  --default_tokenizer TokenBigram \
  --normalizer NormalizerAuto
# インデックスカラム
column_create Tokens taiyaki_index \
  COLUMN_INDEX|WITH_POSITION \
  TaiyakiShops name

Groongaを使う流れ: 3

(1) スキーマを作る
(2) インデックスを作る
(3) ((*データを入れる*))
(4) 検索する

データを入れる

* フォーマットはJSON
  * GroongaのJSONパーサーは緩い
  * 多少壊れたJSONも受け付ける

データ例

load --table TaiyakiShops
[
  {
    "_key": "sapporo-yanagiya",
    "name": "札幌の柳屋",
    "location": "43.11629x141.34855"
  }
]

Groongaを使う流れ: 4

(1) スキーマを作る
(2) インデックスを作る
(3) データを入れる
(4) ((*検索する*))

検索する

* 全文検索対象を指定する
* 検索キーワードを指定する

検索例

select TaiyakiShops \
  --match_columns name \
  --query "札幌"
# [[...], ← レスポンスヘッダー
#  [[[1], ← ヒット件数
#    ↓ 出力内容のメタデータ
#    [["_id","UInt32"],...],
#    ↓ マッチしたレコード
#    [1,"sapporo-yanagiya","...","札幌の柳屋"]]]]

Groongaを使う流れの再確認

(1) スキーマを作る
(2) インデックスを作る
(3) データを入れる
(4) 検索する

流れ3

* Droongaとはなにか
* Groongaの使い方
* ((*↑とDroongaの使い方の違い*))
* Droongaの考え方のイメージ

Droongaを使う流れ

(1) クラスターを作る ← ((*New*))
(2) スキーマを作る
(3) インデックスを作る
(4) データを入れる
(5) 検索する

クラスターを作る

((‘note:大事だけど時間がないので’))n 省略!

流れ4

* Droongaとはなにか
* Groongaの使い方
* ↑とDroongaの使い方の違い
* ((*Droongaの考え方のイメージ*))

Droongaの構成

# image
# src = images/droonga-system.png
# relative_width = 80

((‘tag:center’))((‘note:droonga.org/overview/’))

まとめ1

* Droonga
  * スケールアウト可能なGroonga
  * Groongaと同じことがいろいろある
  * Groongaの理解が役立つ

まとめ2

* Groongaの使い方
  (1) スキーマを作る
  (2) インデックスを作る
  (3) データを入れる
  (4) 検索する

まとめ3

* Droongaの使い方
  (1) クラスターを作る
  (2) 以下、Groongaと同じ

まとめ4

((‘tag:center’))Droongaの構成

* n個のGroongaで\n
  大きなGroongaを構成
* Droonga=大きなGroonga

今日の目標の確認

1人以上n Droongaデビューn ((‘note:を見据えてGroongaデビュー’))