本文へスキップ
`Ctrl`+`K`

# 7.7.2.2. `ExtractorJSON`

## 7.7.2.2.1. 概要

Added in version 16.0.6.

注釈

これは実験的な機能です。現時点ではまだ安定しきっていません。

`ExtractorJSON` は、JSONPath式を使ってJSONデータから値を抽出します。このエクストラクターを使うと、JSONテキスト全体をインデックスすることなく、必要な値だけをJSONからインデックスできます。

抽出された値は、JSONでの型を保持します。例えば、JSON中の文字列はテキストとして抽出され、JSON中の整数は整数として抽出されます。そのため、 `ExtractorJSON` は文字列に対する全文検索と数値に対する範囲検索の両方に使えます。

注釈

`ExtractorJSON` は jsoncons ライブラリーを必要とします。jsonconsなしでGroongaをビルドした場合は利用できません。

## 7.7.2.2.2. 構文

`ExtractorJSON` には必須の `path` パラメーターがあります。

    ExtractorJSON("path", "JSONPath")

## 7.7.2.2.3. 使い方

以下は、 `$.tags[*]` というJSONPathで `tags` 配列のすべての要素を抽出する例です。 `title` の値はJSONPathにマッチしないため抽出されません。

実行例：

    extract \
      --extractors 'ExtractorJSON("path", "$.tags[*]")' \
      --value '{"tags": ["groonga", "search", "engine"], "title": "ignored"}'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "extracted": [
    #       "groonga",
    #       "search",
    #       "engine"
    #     ]
    #   }
    # ]

JSONPathはネストした値にもマッチできます。以下の例では、 `$.values[*][*]` というJSONPathでネストした配列のすべての要素を抽出します。

実行例：

    extract \
      --extractors 'ExtractorJSON("path", "$.values[*][*]")' \
      --value '{"values": [[1, 10], [100, 1000]]}'
    # [[0,1337566253.89858,0.000355720520019531],{"extracted":[1,10,100,1000]}]

`ExtractorJSON` を語彙表に割り当てると、語彙表は抽出された値をインデックスします。元のJSONはデータカラムに保持されます。

以下の例では、JSONカラム中の整数をインデックスします。抽出される値が整数なので、語彙表のキーの型は `Int32` です。JSONカラムがロードされるときにインデックスが自動的に使われるため、抽出された値で元のレコードを検索できます。

実行例：

    table_create Data TABLE_NO_KEY
    # [[0,1337566253.89858,0.000355720520019531],true]
    column_create Data value COLUMN_SCALAR JSON
    # [[0,1337566253.89858,0.000355720520019531],true]
    table_create Numbers TABLE_PAT_KEY Int32 \
      --extractors 'ExtractorJSON("path", "$.value[*][*]")'
    # [[0,1337566253.89858,0.000355720520019531],true]
    column_create Numbers data_value COLUMN_INDEX Data value
    # [[0,1337566253.89858,0.000355720520019531],true]
    load --table Data
    [
    {"value": "{\"value\": [[1, 10], [100]]}"},
    {"value": "{\"value\": [[2], [20, 200]]}"},
    {"value": "{\"value\": [[-1, -10], [-100]]}"}
    ]
    # [[0,1337566253.89858,0.000355720520019531],3]
    select Data --filter 'between(Numbers.data_value, 10, 20)'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "value",
    #           "JSON"
    #         ]
    #       ],
    #       [
    #         1,
    #         {
    #           "value": [
    #             [
    #               1,
    #               10
    #             ],
    #             [
    #               100
    #             ]
    #           ]
    #         }
    #       ],
    #       [
    #         2,
    #         {
    #           "value": [
    #             [
    #               2
    #             ],
    #             [
    #               20,
    #               200
    #             ]
    #           ]
    #         }
    #       ]
    #     ]
    #   ]
    # ]

値がJSONのネストした配列に格納されていても、抽出された値が `10` から `20` の間にあるレコードが選択されます。

## 7.7.2.2.4. 引数

### 7.7.2.2.4.1. 必須引数

#### 7.7.2.2.4.1.1. `path`

抽出する値にマッチするJSONPath式を指定します。

JSONPath式は `$` で始まります。これはJSON値のルートを意味します。例えば、 `$.tags[*]` は `tags` 配列のすべての要素にマッチし、 `$.values[*][*]` は `values` の下のネストした配列のすべての要素にマッチします。

このパラメーターは必須です。このパラメーターがない場合、 `ExtractorJSON` はエラーを報告します。

## 7.7.2.2.5. 参考

- エクストラクター

- table_create