# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.3.48. `schema`

## 7.3.48.1. 概要

バージョン 5.0.9 で追加.

`schema` コマンドはデータベース内のスキーマを返します。

このコマンドはデータベースの詳細を知りたいときに便利です。たとえば、データベースを視覚化したり、データベースのGUIを作ったりするときに便利です。

## 7.3.48.2. 構文

このコマンドに引数はありません:

    schema

## 7.3.48.3. 使い方

以下は出力例を示すためのサンプルスキーマです。

実行例:

    table_create Memos TABLE_HASH_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Memos content COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms memos_content_index \
      COLUMN_INDEX|WITH_POSITION \
      Memos content
    # [[0, 1337566253.89858, 0.000355720520019531], true]

このサンプルスキーマに対する `schema` コマンドの出力は次の通りです。

実行例:

    schema
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "tables": {
    #       "Terms": {
    #         "normalizer": {
    #           "name": "NormalizerAuto"
    #         },
    #         "name": "Terms",
    #         "tokenizer": {
    #           "name": "TokenBigram"
    #         },
    #         "command": {
    #           "command_line": "table_create --name Terms --flags TABLE_PAT_KEY --key_type ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto",
    #           "name": "table_create",
    #           "arguments": {
    #             "key_type": "ShortText",
    #             "default_tokenizer": "TokenBigram",
    #             "normalizer": "NormalizerAuto",
    #             "flags": "TABLE_PAT_KEY",
    #             "name": "Terms"
    #           }
    #         },
    #         "indexes": [],
    #         "key_type": {
    #           "type": "type",
    #           "name": "ShortText"
    #         },
    #         "value_type": null,
    #         "token_filters": [],
    #         "type": "patricia trie",
    #         "columns": {
    #           "memos_content_index": {
    #             "name": "memos_content_index",
    #             "weight": false,
    #             "section": false,
    #             "compress": null,
    #             "command": {
    #               "command_line": "column_create --table Terms --name memos_content_index --flags COLUMN_INDEX|WITH_POSITION --type Memos --sources content",
    #               "name": "column_create",
    #               "arguments": {
    #                 "table": "Terms",
    #                 "flags": "COLUMN_INDEX|WITH_POSITION",
    #                 "name": "memos_content_index",
    #                 "sources": "content",
    #                 "type": "Memos"
    #               }
    #             },
    #             "indexes": [],
    #             "sources": [
    #               {
    #                 "table": "Memos",
    #                 "name": "content",
    #                 "full_name": "Memos.content"
    #               }
    #             ],
    #             "value_type": {
    #               "type": "reference",
    #               "name": "Memos"
    #             },
    #             "full_name": "Terms.memos_content_index",
    #             "position": true,
    #             "table": "Terms",
    #             "type": "index"
    #           }
    #         }
    #       },
    #       "Memos": {
    #         "normalizer": null,
    #         "name": "Memos",
    #         "tokenizer": null,
    #         "command": {
    #           "command_line": "table_create --name Memos --flags TABLE_HASH_KEY --key_type ShortText",
    #           "name": "table_create",
    #           "arguments": {
    #             "key_type": "ShortText",
    #             "flags": "TABLE_HASH_KEY",
    #             "name": "Memos"
    #           }
    #         },
    #         "indexes": [],
    #         "key_type": {
    #           "type": "type",
    #           "name": "ShortText"
    #         },
    #         "value_type": null,
    #         "token_filters": [],
    #         "type": "hash table",
    #         "columns": {
    #           "content": {
    #             "name": "content",
    #             "weight": false,
    #             "section": false,
    #             "compress": null,
    #             "command": {
    #               "command_line": "column_create --table Memos --name content --flags COLUMN_SCALAR --type Text",
    #               "name": "column_create",
    #               "arguments": {
    #                 "table": "Memos",
    #                 "flags": "COLUMN_SCALAR",
    #                 "name": "content",
    #                 "type": "Text"
    #               }
    #             },
    #             "indexes": [
    #               {
    #                 "table": "Terms",
    #                 "section": 0,
    #                 "name": "memos_content_index",
    #                 "full_name": "Terms.memos_content_index"
    #               }
    #             ],
    #             "sources": [],
    #             "value_type": {
    #               "type": "type",
    #               "name": "Text"
    #             },
    #             "full_name": "Memos.content",
    #             "position": false,
    #             "table": "Memos",
    #             "type": "scalar"
    #           }
    #         }
    #       }
    #     },
    #     "normalizers": {
    #       "NormalizerNFKC51": {
    #         "name": "NormalizerNFKC51"
    #       },
    #       "NormalizerAuto": {
    #         "name": "NormalizerAuto"
    #       }
    #     },
    #     "token_filters": {},
    #     "tokenizers": {
    #       "TokenBigramSplitSymbolAlphaDigit": {
    #         "name": "TokenBigramSplitSymbolAlphaDigit"
    #       },
    #       "TokenRegexp": {
    #         "name": "TokenRegexp"
    #       },
    #       "TokenBigramIgnoreBlankSplitSymbolAlphaDigit": {
    #         "name": "TokenBigramIgnoreBlankSplitSymbolAlphaDigit"
    #       },
    #       "TokenBigram": {
    #         "name": "TokenBigram"
    #       },
    #       "TokenDelimit": {
    #         "name": "TokenDelimit"
    #       },
    #       "TokenUnigram": {
    #         "name": "TokenUnigram"
    #       },
    #       "TokenBigramSplitSymbol": {
    #         "name": "TokenBigramSplitSymbol"
    #       },
    #       "TokenDelimitNull": {
    #         "name": "TokenDelimitNull"
    #       },
    #       "TokenBigramIgnoreBlankSplitSymbolAlpha": {
    #         "name": "TokenBigramIgnoreBlankSplitSymbolAlpha"
    #       },
    #       "TokenBigramSplitSymbolAlpha": {
    #         "name": "TokenBigramSplitSymbolAlpha"
    #       },
    #       "TokenTrigram": {
    #         "name": "TokenTrigram"
    #       },
    #       "TokenMecab": {
    #         "name": "TokenMecab"
    #       },
    #       "TokenBigramIgnoreBlankSplitSymbol": {
    #         "name": "TokenBigramIgnoreBlankSplitSymbol"
    #       },
    #       "TokenBigramIgnoreBlank": {
    #         "name": "TokenBigramIgnoreBlank"
    #       }
    #     },
    #     "plugins": {},
    #     "types": {
    #       "UInt64": {
    #         "can_be_key_type": true,
    #         "name": "UInt64",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "Int32": {
    #         "can_be_key_type": true,
    #         "name": "Int32",
    #         "can_be_value_type": true,
    #         "size": 4
    #       },
    #       "Int16": {
    #         "can_be_key_type": true,
    #         "name": "Int16",
    #         "can_be_value_type": true,
    #         "size": 2
    #       },
    #       "LongText": {
    #         "can_be_key_type": false,
    #         "name": "LongText",
    #         "can_be_value_type": false,
    #         "size": 2147483648
    #       },
    #       "TokyoGeoPoint": {
    #         "can_be_key_type": true,
    #         "name": "TokyoGeoPoint",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "Text": {
    #         "can_be_key_type": false,
    #         "name": "Text",
    #         "can_be_value_type": false,
    #         "size": 65536
    #       },
    #       "ShortText": {
    #         "can_be_key_type": true,
    #         "name": "ShortText",
    #         "can_be_value_type": false,
    #         "size": 4096
    #       },
    #       "Float": {
    #         "can_be_key_type": true,
    #         "name": "Float",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "UInt8": {
    #         "can_be_key_type": true,
    #         "name": "UInt8",
    #         "can_be_value_type": true,
    #         "size": 1
    #       },
    #       "UInt32": {
    #         "can_be_key_type": true,
    #         "name": "UInt32",
    #         "can_be_value_type": true,
    #         "size": 4
    #       },
    #       "Object": {
    #         "can_be_key_type": true,
    #         "name": "Object",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "UInt16": {
    #         "can_be_key_type": true,
    #         "name": "UInt16",
    #         "can_be_value_type": true,
    #         "size": 2
    #       },
    #       "Int64": {
    #         "can_be_key_type": true,
    #         "name": "Int64",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "Time": {
    #         "can_be_key_type": true,
    #         "name": "Time",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "Bool": {
    #         "can_be_key_type": true,
    #         "name": "Bool",
    #         "can_be_value_type": true,
    #         "size": 1
    #       },
    #       "WGS84GeoPoint": {
    #         "can_be_key_type": true,
    #         "name": "WGS84GeoPoint",
    #         "can_be_value_type": true,
    #         "size": 8
    #       },
    #       "Int8": {
    #         "can_be_key_type": true,
    #         "name": "Int8",
    #         "can_be_value_type": true,
    #         "size": 1
    #       }
    #     }
    #   }
    # ]

## 7.3.48.4. 引数

このセクションではすべての引数について説明します。

### 7.3.48.4.1. 必須引数

必須の引数はありません。

### 7.3.48.4.2. 省略可能引数

省略可能な引数はありません。

## 7.3.48.5. 戻り値

`schema` はこのデータベースのスキーマを返します。:

    [HEADER, SCHEMA]

### 7.3.48.5.1. `HEADER`

`HEADER` については 出力形式 を参照してください。

### 7.3.48.5.2. `SCHEMA`

`SCHEMA` は以下の情報を含んだオブジェクトです。:

    {
      "plugins":       PLUGINS,
      "types":         TYPES,
      "tokenizers":    TOKENIZERS,
      "normalizers":   NORMALIZERS,
      "token_filters": TOKEN_FITLERS,
      "tables":        TABLES
    }

### 7.3.48.5.3. `PLUGINS`

`PLUGINS` はオブジェクトです。キーはプラグイン名で値はプラグインの詳細です。:

    {
      "PLUGIN_NAME_1": PLUGIN_1,
      "PLUGIN_NAME_2": PLUGIN_2,
      ...
      "PLUGIN_NAME_n": PLUGIN_n
    }

### 7.3.48.5.4. `PLUGIN`

`PLUGIN` はプラグインの詳細を示すオブジェクトです。

    {
      "name": PLUGIN_NAME
    }

以下は `PLUGIN` のプロパティです。

名前 | 説明
--- | ---
`name` | プラグイン名。 plugin_register で使います。

### 7.3.48.5.5. `TYPES`

`TYPES` はオブジェクトです。キーは型名で、値は型の詳細です。:

    {
      "TYPE_NAME_1": TYPE_1,
      "TYPE_NAME_2": TYPE_2,
      ...
      "TYPE_NAME_n": TYPE_n
    }

### 7.3.48.5.6. `TYPE`

`TYPE` は型の詳細を示すオブジェクトです。:

    {
      "name": TYPE_NAME,
      "size": SIZE_OF_ONE_VALUE_IN_BYTE,
      "can_be_key_type": BOOLEAN,
      "can_be_value_type": BOOLEAN
    }

以下は `TYPE` のプロパティです。

名前 | 説明
--- | ---
`name` | 型名。
`size` | 1つの値のバイト数です。
`can_be_key_type` | この型をテーブルのキーの型に使えるなら `true` 、そうでないなら `false` 。
`can_be_value_type` | この型をテーブルの値の型に使えるなら `true` 、そうでないなら `false` 。

### 7.3.48.5.7. `TOKENIZERS`

`TOKENIZERS` はオブジェクトです。キーはトークナイザー名で値はトークナイザーの詳細です。:

    {
      "TOKENIZER_NAME_1": TOKENIZER_1,
      "TOKENIZER_NAME_2": TOKENIZER_2,
      ...
      "TOKENIZER_NAME_n": TOKENIZER_n
    }

### 7.3.48.5.8. `TOKENIZER`

`TOKENIZER` はトークナイザーの詳細を示すオブジェクトです。:

    {
      "name": TOKENIZER_NAME
    }

以下は `TOKENIZER` のプロパティです。

名前 | 説明
--- | ---
`name` | トークナイザー名。 default_tokenizer で使います。

### 7.3.48.5.9. `NORMALIZERS`

`NORMALIZERS` はオブジェクトです。キーはノーマライザー名で値はノーマライザーの詳細です。:

    {
      "NORMALIZER_NAME_1": NORMALIZER_1,
      "NORMALIZER_NAME_2": NORMALIZER_2,
      ...
      "NORMALIZER_NAME_n": NORMALIZER_n
    }

### 7.3.48.5.10. `NORMALIZER`

`NORMALIZER` はノーマライザーの詳細を示すオブジェクトです。:

    {
      "name": NORMALIZER_NAME
    }

以下は `NORMALIZER` のプロパティです。

名前 | 説明
--- | ---
`name` | ノーマライザー名。 normalizer で使います。

### 7.3.48.5.11. `TOKEN_FILTERS`

`TOKEN_FILTERS` はオブジェクトです。キーはトークンフィルター名で値はトークンフィルターの詳細です。:

    {
      "TOKEN_FILTER_NAME_1": TOKEN_FILTER_1,
      "TOKEN_FILTER_NAME_2": TOKEN_FILTER_2,
      ...
      "TOKEN_FILTER_NAME_n": TOKEN_FILTER_n
    }

### 7.3.48.5.12. `TOKEN_FILTER`

`TOKEN_FILTER` はトークンフィルターの詳細を示すオブジェクトです。:

    {
      "name": TOKEN_FILTER_NAME
    }

以下は `TOKEN_FILTER` のプロパティです。

名前 | 説明
--- | ---
`name` | トークンフィルター名。 token_filters で使います。

### 7.3.48.5.13. `TABLES`

`TABLES` はオブジェクトです。キーはテーブル名で値はテーブルの詳細です。:

    {
      "TABLE_NAME_1": TABLE_1,
      "TABLE_NAME_2": TABLE_2,
      ...
      "TABLE_NAME_n": TABLE_n
    }

### 7.3.48.5.14. `TABLE`

`TABLE` はテーブルの詳細を示すオブジェクトです。

    {
      "name": TABLE_NAME
      "type": TYPE,
      "key_type": KEY_TYPE,
      "value_type": VALUE_TYPE,
      "tokenizer": TOKENIZER,
      "normalizer": NORMALIZER,
      "token_filters": [
        TOKEN_FILTER_1,
        TOKEN_FILTER_2,
        ...,
        TOKEN_FILTER_n,
      ],
      "indexes": [
        INDEX_1,
        INDEX_2,
        ...,
        INDEX_n
      ],
      "command": COMMAND,
      "columns": {
        "COLUMN_NAME_1": COLUMN_1,
        "COLUMN_NAME_2": COLUMN_2,
        ...,
        "COLUMN_NAME_3": COLUMN_3,
      }
    }

以下は `TABLE` のプロパティです。

名前 | 説明
--- | ---
`name` | テーブル名。
`type` | テーブルの種類。 以下のどれかです。 `array`: TABLE_NO_KEY `hash`: TABLE_HASH_KEY `patricia trie`: TABLE_PAT_KEY `double array trie`: TABLE_DAT_KEY
`key_type` | テーブルのキーの型。 テーブルの種類が `array` なら `null` になります。 テーブルの種類が `array` でなければオブジェクトになります。オブジェクトは次のプロパティを持ちます。 `name` ：型名。 `type` ：もし型がテーブルなら `reference` 、そうでないなら `type` 。
`value_type` | テーブルの値の型。 テーブルが「値」を使っていない場合は `null` になります。 テーブルが「値」を使っている場合はオブジェクトになります。オブジェクトは次のプロパティを持ちます。 `name` ：型名。 `type` ：もし型がテーブルなら `reference` 、そうでないなら `type` 。
`tokenizer` | テーブルのトークナイザー。 default_tokenizer で指定されたものです。 テーブルがトークナイザーを使っていない場合は `null` になります。 テーブルがトークナイザーを使っている場合はオブジェクトになります。オブジェクトは次のプロパティを持ちます。 `name` ：トークナイザー名。
`normalizer` | テーブルのノーマライザー。 normalizer で指定されたものです。 テーブルがノーマライザーを使っていない場合は `null` になります。 テーブルがノーマライザーを使っている場合はオブジェクトになります。オブジェクトは次のプロパティを持ちます。 `name` ：ノーマライザー名。
`token_filters` | テーブルのトークンフィルターです。 token_filters で指定されたものです。 オブジェクトの配列です。オブジェクトは次のプロパティを持ちます。 `name` ：トークンフィルター名。
`indexes` | テーブルのキーに対するインデックス。 INDEX の配列です。
`command` | このテーブルを作るためのGroongaコマンドに関する情報。 COMMAND になります。
`columns` | テーブルのカラム。 オブジェクトです。キーはカラム名で値は COLUMN です。

### 7.3.48.5.15. `INDEX`

`INDEX` はインデックスの詳細を示すオブジェクトです。:

    {
      "full_name": INDEX_COLUMN_NAME_WITH_TABLE_NAME,
      "table":     TABLE_NAME,
      "name":      INDEX_COLUMN_NAME,
      "section":   SECTION
    }

以下は `INDEX` のプロパティです。

名前 | 説明
--- | ---
`full_name` | テーブル名を含むインデックスカラム名。 例： `Terms.index`
`table` | インデックスカラムのテーブル名。 例： `Terms`
`name` | インデックスカラム名。 例： `index`
`section` | テーブルのキーに対するインデックスカラムのセクション番号。 インデックスカラムがマルチカラムインデックスでない場合は `0` になります。

### 7.3.48.5.16. `COMMAND`

`COMMAND` はこのテーブル・カラムを作る方法を示したオブジェクトです。:

    {
      "name": COMMAND_NAME,
      "arguments": {
        "KEY_1": "VALUE_1",
        "KEY_2": "VALUE_2",
        ...,
        "KEY_n": "VALUE_n"
      },
      "command_line": COMMAND_LINE
    }

以下は `COMMAND` のプロパティです。

名前 | 説明
--- | ---
`name` | このテーブル・カラムを作るGroongaコマンドの名前。
`arguments` | このテーブル・カラムを作るためのGroongaコマンドの引数。 オブジェクトになります。キーは引数名で値は引数の値です。
`command_line` | このテーブル・カラムを作るGroongaコマンドのコマンドラインです。 この文字列はGroongaが評価できます。

### 7.3.48.5.17. `COLUMN`

`COLUMN` はカラムの詳細を示したオブジェクトです。:

    {
      "name": COLUMN_NAME,
      "table": TABLE_NAME,
      "full_name": COLUMN_NAME_WITH_TABLE,
      "type": TYPE,
      "value_type": VALUE_TYPE,
      "compress": COMPRESS,
      "section": SECTION,
      "weight": WEIGHT,
      "compress": COMPRESS,
      "section": BOOLEAN,
      "weight": BOOLEAN,
      "position": BOOLEAN,
      "sources": [
        SOURCE_1,
        SOURCE_2,
        ...,
        SOURCE_n
      ],
      "indexes": [
        INDEX_1,
        INDEX_2,
        ...,
        INDEX_n
      ],
      "command": COMMAND
    }

以下は `COLUMN` のプロパティです。

名前 | 説明
--- | ---
`name` | カラム名。 例： `age`
`table` | カラムのテーブル名。 例： `Users`
`full_name` | テーブル名を含むカラム名。 例： `Users.age`
`type` | カラムの種類。 以下のどれかです。 `scalar`: スカラーカラム `vector`: ベクターカラム `index`: インデックスカラム
`value_type` | カラムの値の型。 オブジェクトです。このオブジェクトは次のプロパティを持ちます。 `name` ：型名。 `type` ：もし型がテーブルなら `reference` 、そうでないなら `type` 。
`compress` | カラムの圧縮方法です。 カラムがどの圧縮方法も使っていない場合は `null` になります。 カラムが圧縮方法を使っている場合は次のどれかになります。 `zlib` ：カラムの値を圧縮するためにzlibを使います。 `lz4` ：カラムの値を圧縮するためにLZ4を使います。
`section` | カラムがセクション情報を保存できるかどうか。 `WITH_SECTION` フラグ付きでカラムを作ったときは `true` 、そうでないときは `false` になります。 通常、インデックスカラムでない場合は `false` になります。
`weight` | カラムが重み情報を保存できるかどうか。 `WITH_WEIGHT` フラグ付きでカラムを作ったときは `true` 、そうでないときは `false` になります。
`position` | カラムが位置情報を保存できるかどうか。 `WITH_POSITION` フラグ付きでカラムを作ったときは `true` 、そうでないときは `false` になります。 通常、インデックスカラムでない場合は `false` になります。
`sources` | インデックスカラムのソースカラム。 SOURCE の配列になります。 通常、カラムがインデックスカラムでない場合は空配列になります。
`indexes` | カラムのインデックス。 INDEX の配列です。
`command` | このカラムを作るためのGroongaコマンド情報。 COMMAND になります。

### 7.3.48.5.18. `SOURCE`

`SOURCE` はソースの詳細を示すオブジェクトです。:

    {
      "name":      COLUMN_NAME,
      "table":     TABLE_NAME,
      "full_name": COLUMN_NAME_WITH_TABLE_NAME
    }

以下は `SOURCE` のプロパティです。

名前 | 説明
--- | ---
`name` | ソースカラム名。 例： `content` `_key` 擬似カラムになるかもしれません。
`table` | ソースカラムのテーブル名。 例： `Memos`
`full_name` | テーブル名を含むソースカラム名。 例： `Memos.content`

## 7.3.48.6. 参考

> - table_create
> - column_create