# groonga - An open-source fulltext search engine and column store.

- 日本語版はこちら

### Navigation

- index
- next |
- previous |
- groonga v3.0.0 documentation »
- 4. Tutorial »

# 4.8. パトリシア木による前方一致検索

groongaのテーブルは、テーブル作成時にパトリシア木オプションを指定すると、前方一致検索を行うことができます。また、追加のオプションを指定することにより、主キーの後方一致検索をも行うことができます。

## 4.8.1. 主キーによる前方一致検索

table_createコマンドのflagsオプションにTABLE_PAT_KEYを指定することで、主キーによる前方一致検索ができるようになります。

Execution example:

    table_create --name PatPrefix --flags TABLE_PAT_KEY --key_type ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table PatPrefix
    [
    {"_key":"ひろゆき"},
    {"_key":"まろゆき"},
    {"_key":"ひろあき"},
    {"_key":"ゆきひろ"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]
    select --table PatPrefix --query _key:^ひろ
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         1,
    #         "ひろゆき"
    #       ],
    #       [
    #         3,
    #         "ひろあき"
    #       ]
    #     ]
    #   ]
    # ]

## 4.8.2. 主キーによる後方一致検索

table_createコマンドのflagsオプションにTABLE_PAT_KEYとKEY_WITH_SISを指定することで、主キーによる前方一致検索・後方一致検索の両方が可能となります。

KEY_WITH_SISフラグを付与すると、データを追加する際に後方一致用のレコードも追加されてしまいます。そのため、単純に検索すると、元のレコードに加えて自動的に追加されたレコードまでヒットしてしまいます。元のレコードのみ検索するために、一工夫必要になります。

例えば、元のレコードと自動的に追加されたレコードとの区別をつけるために、元のレコードであることを示すoriginalカラムを追加して、検索時にはoriginalカラムが `true` も検索条件に加えます。 `--query` オプションでは `Bool` 型の値を直感的に指定することができないので `--filter` オプションを使っていることに注意してください。

Execution example:

    table_create --name PatSuffix --flags TABLE_PAT_KEY|KEY_WITH_SIS --key_type ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create --table PatSuffix --name original --type Bool
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table PatSuffix
    [
    {"_key":"ひろゆき","original":true},
    {"_key":"まろゆき","original":true},
    {"_key":"ひろあき","original":true},
    {"_key":"ゆきひろ","original":true}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]
    select --table PatSuffix --query _key:$ゆき
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         4
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "original",
    #           "Bool"
    #         ]
    #       ],
    #       [
    #         3,
    #         "ゆき",
    #         false
    #       ],
    #       [
    #         2,
    #         "ろゆき",
    #         false
    #       ],
    #       [
    #         5,
    #         "まろゆき",
    #         true
    #       ],
    #       [
    #         1,
    #         "ひろゆき",
    #         true
    #       ]
    #     ]
    #   ]
    # ]
    select --table PatSuffix --filter '_key @$ "ゆき" && original == true'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "original",
    #           "Bool"
    #         ]
    #       ],
    #       [
    #         5,
    #         "まろゆき",
    #         true
    #       ],
    #       [
    #         1,
    #         "ひろゆき",
    #         true
    #       ]
    #     ]
    #   ]
    # ]

### Navigation

- index
- next |
- previous |
- groonga v3.0.0 documentation »
- 4. Tutorial »