Document #945

hroonga の仕様

Added by Masafumi oyamada about 7 years ago. Updated about 7 years ago.

Status:完了Start date:06/03/2011
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:-
Target version:0.1

dump.txt Magnifier (592 Bytes) Masafumi oyamada, 06/18/2011 06:34 pm

History

#1 Updated by Masafumi oyamada about 7 years ago

GET    /tables/
POST   /tables//create
POST   /tables/
/columns//create GET /tables/
/columns => columns GET /tables/
/columns/ => column GET /tables/
/columns => カラム一覧 GET /tables/
/records => records (select) GET /tables/
/records/ => record (select) PUT /tables/
/records//update => edit record POST /tables/
/records//create => new record DELETE /tables/
/records//delete => delete GET /tables/
/records?filter=... (select)

#2 Updated by Masafumi oyamada about 7 years ago

成功時、

{
  "return_code" : 0,
  "timestamp" : 1232312,
  "elapsed_time" : 0.00021,
  "records" : [
  ],
  "drilldown" : {
    "age" : {
      "20" : { "count" : 300, "score" : 0.1 },
      "21" : { ... },
    }
  }
}

失敗時、

{
  "return_code" : -21,
  "timestamp" : 1232312,
  "elapsed_time" : 0.00021,
  "error": "name can't start with '_' and 0-9, and contains only 0-9, A-Z, a-z, or _: <_key>"
}

#3 Updated by Masafumi oyamada about 7 years ago

成功時、

{
  "return_code" : 0,
  "timestamp" : 1232312,
  "elapsed_time" : 0.00021,
  "result" : {
      "columns": [
        ["_id","UInt32"],["_key","UInt16"],["age","UInt8"]
      ],
      "records" : [
      ]
    },
  ],
  "drilldown_result" : {
    "age" : {
      "columns" : [
        ["_key","UInt8"],["_nsubrecs","Int32"]
      ],
      "records" : [
        [20, 3].
        [21, 4]
      ]
    }
  }
}

失敗時、

{
  "return_code" : -21,
  "timestamp" : 1232312,
  "elapsed_time" : 0.00021,
  "error": "name can't start with '_' and 0-9, and contains only 0-9, A-Z, a-z, or _: <_key>" 
}

#4 Updated by Ryo Onodera about 7 years ago

須藤さんからの提案

動詞をURLから除く

成功時にはreturn_codeを出さない。エラーの時だけエラー専用のレスポンスを返す。

検索結果のヒット数が大きい場合、レスポンスのサイズは大きくなりやすい。そうなった場合でもそうでなくても、同じJSONのフォーマットを欲しい。

つまりは巨大なJSONデータをストリーミングできるようなJSONフォーマットにしなければならない。

#5 Updated by Hiroshi SHIMODA about 7 years ago

GET    /tables/
POST   /tables/
=> new table DELETE /tables/
=> drop table GET /tables/
/columns => show columns GET /tables/
/columns/ => show existing column POST /tables/
/columns/ => new column DELETE /tables/
/columns/ => delete column GET /tables/
/records => show all existing records (select) GET /tables/
/records?filter=... => search existing records (select) GET /tables/
/records/ => show existing one record (select) POST /tables/
/records/ => new record PUT /tables/
/records/ => edit record DELETE /tables/
/records/ => delete record

#6 Updated by Hiroshi SHIMODA about 7 years ago

(obsolete)

#7 Updated by Hiroshi SHIMODA about 7 years ago

当日の作業の流れ

共通部分の実装:routing, request, responseのクラス(Rack::Request, Rack::Responseを継承したHroonga::Request, Hroonga::Response)

旧HTTP API互換APIの実装(小野寺)→簡単にできそうであれば。詰まるようならスキップする。

自動テストの用意

各人の分担箇所の実装

小野寺→Selector API

下田→それ以外

成果報告の準備

シナリオを用意する(発表時にとちらないように)

目標

  • 検索が動作する所までは最低でも到達する

#8 Updated by Hiroshi SHIMODA about 7 years ago

GET /types => array of supported types
GET /tokenizers => array of supported tokenizers

#9 Updated by Hiroshi SHIMODA about 7 years ago

GET/POST/PUT/DELETE失敗時、

{
  "return_code" : -21,
  "error": "name can't start with '_' and 0-9, and contains only 0-9, A-Z, a-z, or _: <_key>" 
}

POST/PUT/DELETE成功時

{}

/tables 以下のレスポンス

GET成功時、テーブル一覧を返す場合

{
  "tables" : {
    "entries" : {} // キーはテーブル名
        "default_tokenizer" : "...",
        ...
      }
    ]
  }
}

GET成功時、カラム一覧を返す場合

{
  "tables" : {
    "entries" : { // キーはテーブル名
        "columns": [
          ["_id","UInt32"],["_key","UInt16"],["age","UInt8"]
        ]
      }
    ]
  }
}

GET成功時、レコードを返す場合

{
  "tables" : {
    "entries" : { // キーはテーブル名
      "columns": [
        ["_id","UInt32"],["_key","UInt16"],["age","UInt8"]
      ],
      "records" : [
      ],
      "drilldown" : {
        "age" : {
          "columns" : [
            ["_key","UInt8"],["_nsubrecs","Int32"]
          ],
          "records" : [
            [20, 3].
            [21, 4]
          ]
        }
      }
    }
  }
}

GET成功時、ドリルダウンの結果だけを返す場合

{
  "tables" : {
    "entries" : { // キーはテーブル名
      "drilldown" : {
        "age" : {
          "columns" : [
            ["_key","UInt8"],["_nsubrecs","Int32"]
          ],
          "records" : [
            [20, 3].
            [21, 4]
          ]
        }
      }
    }
  }
}

GET /types

{
  "types" : ["UInt8", "Int32", ...]
}

GET /tokenizers

{
  "tokenizers" : ["TokenBigram", "TokenMecab", ...]
}

#10 Updated by Hiroshi SHIMODA about 7 years ago

各人の分担箇所の実装

下田→それ以外

以下の2つを早めに作る。(JavaScriptのレイヤとの連携の確認のため)

table作成

table一覧の取得

#11 Updated by Hiroshi SHIMODA about 7 years ago

POST・PUT時のパラメータ

  • テーブル名、カラム名、レコードのキー→URLで指定
  • データ型 ** テーブルのキーのデータ型:key_type (UInt8, ...) ** カラムのデータ型:column_type (UInt8, ...) ** 値のデータ型:value_type (UInt8, ...)
  • テーブルの種類:table_type (hash, patricia_trie, ...)
  • カラムの種類:column_type (vector, scalar)
  • デフォルトトークナイザ:default_tokenizer (TokenBigram, TokenMecab, ...)
  • その他のフラグ:flags(整数値)

#12 Updated by Hiroshi SHIMODA about 7 years ago

POST, PUTでレコードの情報を更新する時のリクエストで レコードの内容を渡すにはbodyパラメータを使う。 recordパラメータにはJSON文字列を設定する。

recordのJSON文字列は、カラム名をキー、そのカラムに入れる値をハッシュの値とした物にする。

table_type=...&...&record={"id":12345,"value":"foobar",...} (JSON)

#13 Updated by Hiroshi SHIMODA about 7 years ago

(obsolete)

#14 Updated by Hiroshi SHIMODA about 7 years ago

POST・PUT時のパラメータ

  • テーブル名、カラム名、レコードのキー→URLで指定
  • データ型 ** テーブルのキーのデータ型:key_type (UInt8, ...) ** カラムの種類:column_type (scalar, vector, index) ** 値のデータ型:value_type (UInt8, ...)
  • テーブルの種類:table_type (Hash, PatriciaTrie, ...)
  • デフォルトトークナイザ:default_tokenizer (TokenBigram, TokenMecab, ...)
  • その他のフラグ:flags(定数名を「|」で繋げる)
  • 流し込むデータ:recordsへのPOSTの場合→records (JSON, ハッシュの配列)

成果発表の時のシナリオ

http://groonga.org/docs/tutorial/tutorial01.html に準拠

テーブル作成

POST /tables/Site

##* data: table_type=Hash&key_type=ShortText ##* => 200 OK

テーブル一覧を見る

GET /tables

##* => 200 OK

{
  "tables" : {
    "Site" : {
      "table_type" : "Hash",
      "key_type" : "ShortText",
      ...
    }
  }
}

カラムを追加

POST /tables/Site/columns/title

##* data: column_type=scalar&value_type=ShortText ##* => 200 OK

カラム一覧を見る

GET /tables/Site/columns

##* => 200 OK

{
  "columns" : [
    ["_id","UInt32"], ["_key","ShortText"], ["title","ShortText"]
  ]
}

全文検索用の語彙表の作成

POST /tables/Terms

##* data: table_type=PatriciaTrie&key_type=ShortText&default_tokenizer=TokenBigram&flags=KEY_NORMALIZE ##* => 200 OK

全文検索用のインデックスカラムの作成

POST /tables/Terms/columns/blog_title

##* data: column_type=index&value_type=Site&source=title&flags=WITH_POSITION ##* => 200 OK

データのロード

POST /tables/Site/records (/records へのPOSTで複数の項目のPOSTを受け付ける機能)

##* data:

records=[
    {"_key":"http://example.org/","title":"This is test record 1!"},
    {"_key":"http://example.net/","title":"test record 2."},
    {"_key":"http://example.com/","title":"test test record three."},
    {"_key":"http://example.net/afr","title":"test record four."},
    {"_key":"http://example.org/aba","title":"test test test record five."},
    {"_key":"http://example.com/rab","title":"test test test test record six."},
    {"_key":"http://example.net/atv","title":"test test test record seven."},
    {"_key":"http://example.org/gat","title":"test test record eight."},
    {"_key":"http://example.com/vdw","title":"test test record nine."}
]
##* => 200 OK

レコードの検索

GET /tables/Site/records

##* => 200 OK

{
  "columns" : [
    ["_id","UInt32"], ["_key","ShortText"], ["title","ShortText"]
  ],
  "records" : [
    [1,"http://example.org/","This is test record 1!"],
    [2,"http://example.net/","test record 2."],
    [3,"http://example.com/","test test record three."],
    [4,"http://example.net/afr","test record four."],
    [5,"http://example.org/aba","test test test record five."],
    [6,"http://example.com/rab","test test test test record six."],
    [7,"http://example.net/atv","test test test record seven."],
    [8,"http://example.org/gat","test test record eight."],
    [9,"http://example.com/vdw","test test record nine."]
  ]
}

レコードの全文検索

GET /tables/Site/records?query=title:@this

##* => 200 OK

{
  "columns" : [
    ["_id","UInt32"], ["_key","ShortText"], ["title","ShortText"]
  ],
  "records" : [
    [1,"http://example.org/","This is test record 1!"]
  ]
}

#15 Updated by Ryo Onodera about 7 years ago

  • Target version set to 0.1

#16 Updated by Masafumi oyamada about 7 years ago

デモを実行後のダンプファイルを添付します.

#17 Updated by Ryo Onodera about 7 years ago

デモの結果 PatriciaTrieで作られなくてHashになった KEY_NORMALIZEで作られなかった。

その点を除けば、チュートリアルは動いた。

#18 Updated by Ryo Onodera about 7 years ago

Ryo Onodera wrote:

デモの結果
PatriciaTrieで作られなくてHashになった
KEY_NORMALIZEで作られなかった。

下田さんに直してもらいました!

#19 Updated by Ryo Onodera about 7 years ago

デモがちゃんと動きました!

#20 Updated by Ryo Onodera about 7 years ago

  • Status changed from 新規 to 完了チェック待ち

#21 Updated by Ryo Onodera about 7 years ago

  • Status changed from 完了チェック待ち to 完了

Also available in: Atom PDF