Edited at

Groongaで学ぶ全文検索 2015-10-16

More than 3 years have passed since last update.


スキーマ設計をやってみる


スキーマ設計とは

良い感じに検索できるようにtableとcloumnを定義する事


スキーマ設計手順


1.まずは何が返ってきて欲しいかを決める

記事、コメント、電子書籍など


2.何で検索したいかを決める

記事、コメントなど


3.返ってきて欲しいもののtableを作る

電子書籍ならBooks

記事ならPosts

など


4.検索したいものをcolumnにする

書籍ならtitle

著者ならauthor

など


例題の設計


例題

ユーザーが広告を検索するケースを想定

広告データの情報:ID,名前、説明、画像など


1.まずは何が返ってきて欲しいかを決める

広告のリストが返ってきて欲しい


2.何で検索したいかを決める

広告名と説明


3.返ってきて欲しいもののtableを作る

広告なのでAdsというtableを作成する


テーブルの選び方

Groongaにはテーブルがいくつかある

どのテーブルもID=レコードを識別する番号を持っている


  • ハッシュテーブル:キーがある

  • パトリシアトライ:キーがある

  • ダブルアレイトライ:キーがある

  • 配列(アレイ):キーはないがIDは持っている
    →削除するとIDは使いまわされるので注意

後から消さないなら配列、後から消すならキーがあるものを選択する事。

テーブルについての資料

http://groonga.org/ja/docs/reference/tables.html


4.検索したいものをcolumnにする

まず説明で検索できるように

descというcolumnを作成する


カラムの種類

スカラー:単体の値、今回説明は一個しかないのでこちらを使う

ベクター[配列]:タグなど複数の値の場合に利用する


例題を実際に検索してみる

※下記などを参考にGroongaがインストールされている事。

http://groonga.org/ja/docs/install/mac_os_x.html#homebrew


1. テーブル作成とカラム作成


create.txt

table_create --name Advs --flags TABLE_HASH_KEY --key_type UInt32

column_create --table Advs --name desc --flags COLUMN_SCALAR --type Text

$ groonga -n ./advs.db < create.txt


2. データをロード


load.txt

load --table Advs

[
{"_key": 1, "desc":"美味しいピザ" },
{"_key": 2, "desc":"美味しいピザ2" },
{"_key": 3, "desc":"美味しいピザ3" },
{"_key": 4, "desc":"美味しいピザ4" },
]


$ groonga advs.db < load.txt


3. 確認

$ groonga advs.db dump

table_create Advs TABLE_HASH_KEY UInt32
column_create Advs desc COLUMN_SCALAR Text

load --table Advs
[
["_key","desc"],
[1,"美味しいピザ"],
[2,"美味しいピザ2"],
[3,"美味しいピザ3"],
[4,"美味しいピザ4"]


4. 検索

$ groonga advs.db select --table Advs --query desc:@ピザ3

[[0,1444999444.82913,0.00431203842163086],[[[1],[["_id","UInt32"],["_key","UInt32"],["desc","Text"]],[3,3,"美味しいピザ3"]]]]


その他メモ


  • idはどのテーブルもUint32

  • 広告の情報とは別に出しても良いテーブルがある場合
    →出しても良いものだけをテーブルに入れる形が高速、n件取得したいなどの要件を満たせる。