Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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件取得したいなどの要件を満たせる。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away