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

# 7.21. インデックス構築

Groongaは2.0.0から動的なインデックス構築方法と静的なインデックス構築方法を両方サポートしています。

## 7.21.1. 動的なインデックス構築方法

動的なインデックス構築方法では、登録された文書はインデックス構築中にすぐに検索できるようになります。しかし、静的なインデックス構築方法に比べてコストがかかります。

動的なインデックス構築方法は鮮度が重要な検索システムに適しています。例えば、つぶやきやニュースやブログ記事などを検索するシステムは鮮度が重要になるでしょう。動的なインデックス構築方法はできたばかりの文書を検索できるようにし、インデックス構築中も検索できます。

## 7.21.2. 静的なインデックス構築方法

静的なインデックス構築方法では、動的なインデックス構築方法よりもインデックス構築にかかるコストが小さくなります。インデックス構築時間は短くなるでしょう。インデックスは小さくなるでしょう。インデックス構築に必要なリソースは少なくなるでしょう。しかし、登録中の文書は登録しようとしている全ての文書のインデックス構築が終わるまで検索できません。

静的なインデックス構築方法は消費リソースが少ないことが重要な検索システムに適しています。鮮度が重要でないシステムであれば静的なインデックス構築方法が適しているでしょう。例えば、リファレンスマニュアルを検索するシステムは鮮度を重視しません。これは、リファレンスマニュアルはリリース時にだけ更新されるだけだからです。

## 7.21.3. 使い方

Groongaはデフォルトで動的なインデックス構築方法を使います。文書を登録するとすぐに検索できるようになります。

すでにデータが格納されているカラムにインデックスを追加した場合は静的なインデックス構築方法を使います。

スキーマを定義します。

実行例:

    table_create Tweets TABLE_NO_KEY
    # [[0,1337566253.89858,0.000355720520019531],true]
    column_create Tweets content COLUMN_SCALAR ShortText
    # [[0,1337566253.89858,0.000355720520019531],true]
    table_create Lexicon TABLE_HASH_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
    # [[0,1337566253.89858,0.000355720520019531],true]

データを登録します:

実行例:

    load --table Tweets
    [
    {"content":"Hello!"},
    {"content":"I just start it!"},
    {"content":"I'm sleepy... Have a nice day... Good night..."}
    ]
    # [[0,1337566253.89858,0.000355720520019531],3]

インデックスがないときはシーケンシャルサーチで検索できます。

実行例:

    select Tweets --match_columns content --query 'good nice'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         3,
    #         "I'm sleepy... Have a nice day... Good night..."
    #       ]
    #     ]
    #   ]
    # ]

`Tweets.content` 用のインデックスを作成します。すでに `Tweets.content` に登録されているデータは静的なインデックス構築方法でインデックスを構築します:

実行例:

    column_create Lexicon tweet COLUMN_INDEX|WITH_POSITION Tweets content
    # [[0,1337566253.89858,0.000355720520019531],true]

Tip

`--n_workers -1` を指定すると並列にインデックスを構築できます。例:

    column_create Lexicon tweet COLUMN_INDEX|WITH_POSITION Tweets content --n_workers -1

インデックスありで検索します。1件ヒットします:

実行例:

    select Tweets --match_columns content --query 'good nice'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         3,
    #         "I'm sleepy... Have a nice day... Good night..."
    #       ]
    #     ]
    #   ]
    # ]

もう一度データを登録します。このデータ用のインデックスは動的なインデックス構築方法で構築します。

実行例:

    load --table Tweets
    [
    {"content":"Good morning! Nice day."},
    {"content":"Let's go shopping."}
    ]
    # [[0,1337566253.89858,0.000355720520019531],2]

検索すると新しく登録されたレコードもヒットします:

実行例:

    select Tweets --match_columns content --query 'good nice'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         3,
    #         "I'm sleepy... Have a nice day... Good night..."
    #       ],
    #       [
    #         4,
    #         "Good morning! Nice day."
    #       ]
    #     ]
    #   ]
    # ]