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

- English page

# 7.11.1. クエリー構文

クエリー構文は一般的なWebの検索フォームで検索条件を指定するための構文です。Googleの検索フォームで使われている構文に似ています。例えば、 `word1 word2` は `word1` と `word2` の両方の単語を含んだレコードを検索するという意味です。 `word1 OR word2` は `word1` または `word2` のどちらかの単語を含んだレコードを検索します。

クエリー構文は `条件式` と `結合式` と `代入式` から成ります。通常、 `代入式` は考えなくてよいです。なぜなら、 `代入式` は select の `--query` オプションでは無効になっているからです。groongaをライブラリとして使ったときは、クエリー構文のパーサーのオプションをカスタマイズすることで `代入式` を有効にすることができます。

`条件式` は条件を指定します。 `結合式` は1つ以上の `条件式` 、 `結合式` 、 `代入式` から成ります。 `代入式` はカラムに値を代入します。

## 7.11.1.1. サンプルデータ

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

実行例:

    table_create Entries TABLE_PAT_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Entries content COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Entries n_likes COLUMN_SCALAR UInt32
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Entries
    [
    {"_key":    "The first post!",
     "content": "Welcome! This is my first post!",
     "n_likes": 5},
    {"_key":    "Groonga",
     "content": "I started to use groonga. It's very fast!",
     "n_likes": 10},
    {"_key":    "Mroonga",
     "content": "I also started to use mroonga. It's also very fast! Really fast!",
     "n_likes": 15},
    {"_key":    "Good-bye Senna",
     "content": "I migrated all Senna system!",
     "n_likes": 3},
    {"_key":    "Good-bye Tritonn",
     "content": "I also migrated all Tritonn system!",
     "n_likes": 3}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 5]

ブログエントリ用の `Entries` テーブルがあります。各エントリはタイトルと内容と「いいね！」数を持っています。タイトルは `Entries` のキーとします。内容は `Entries.content` カラムの値とします。「いいね！」数は `Entries.n_likes` カラムの値とします。

`Entries._key` カラムと `Entries.content` カラムには `TokenBigram` トークナイザーを使ったインデックスを作成します。そのため、 `Entries._key` と `Entries.content` は両方とも全文検索できます。

これで例を示すためのスキーマとデータの準備ができました。

## 7.11.1.2. エスケープ

クエリー構文には特別な文字があります。特別な文字それ自体を使うためには文字の前に `\` をつけてエスケープしなければいけません。例えば、 `"` は特別な文字です。これは `\"` というようにエスケープします。

以下が特別な文字のリストです:

> - `[space]` （ `[backslash][space]` とエスケープする。）（ `[space]` をASCIIで言えば0x20の空白文字に置き換えて、 `[backslash]` を `\\` に置き換えてください。）

> - `"` （ `\"` とエスケープする。）

> - `'` （ `\'` とエスケープする。）

> - `(` （ `\(` とエスケープする。）

> - `)` （ `\)` とエスケープする。）

> - `\` （ `\\` とエスケープする。）

`\` （バックスラッシュ）以外はエスケープする代わりにクォートすることもできます。クォート中でバックスラッシュをエスケープするときは `\\` というようにバックスラッシュを使います。

クォート構文は `"..."` または `'...'` です。 `"..."` クォート構文中では `"` を `\"` にエスケープする必要があります。 `'...'` クォート構文中では `'` を `\'` にエスケープする必要があります。例えば、 `Alice's brother (Bob)` は `"Alice's brother (Bob)"` あるいは `'Alice\'s brother (Bob)'` とクォートします。

注釈

注意しなければならない大事な点があります。`\` (バックスラッシュ)はコマンドラインシェルが解釈します。それゆえ例えば `(` それ自体を検索したいならシェルでは二重にエスケープ (`\\(`) しなければなりません。コマンドラインシェルは `\\(` を `\(` と解釈してからGroongaに渡します。Groongaは `\(` を `(` とみなし、`(` 自体をデータベースから検索します。もし意図した検索がGroongaで行えないなら、特別な文字を正しくエスケープしているか確認します。

## 7.11.1.3. 条件式

以下は利用可能な条件式の一覧です。

### 7.11.1.3.1. 全文検索条件

構文は `keyword` です。

`全文検索条件` はデフォルトのマッチカラムに対して全文検索するという条件を指定します。マッチカラムとは全文検索対象のカラムのことです。

全文検索に使うデフォルトのマッチカラムを指定する必要があります。マッチカラムは select の `--match_columns` オプションで指定します。デフォルトのマッチカラムを指定していない場合、この条件式は失敗します。

この条件式は `keyword` で全文検索をします。 `keyword` には空白を含めることはできません。 `search keyword` というように空白を含んでいる場合は、 `search` と `keyword` という2つの全文検索条件を指定したことになります。もし、キーワードに空白を含めたい場合は以下で説明する `フレーズ検索条件` を使ってください。

以下は簡単な使用例です。

実行例:

    select Entries --match_columns content --query fast
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]

この式は `content` カラムの値に `fast` という単語を含んでいるレコードにマッチします。

`content` カラムはデフォルトのマッチカラムです。

### 7.11.1.3.2. フレーズ検索条件

構文は `"search keyword"` です。

`フレーズ検索条件` はデフォルトのマッチカラムに対してフレーズ検索するという条件を指定します。

全文検索に使うデフォルトのマッチカラムを指定する必要があります。マッチカラムは select の `--match_columns` オプションで指定します。デフォルトのマッチカラムを指定していない場合、この条件式は失敗します。

この条件式は `search keyword` でフレーズ検索をします。フレーズ検索は `search` と `keyword` がこの順番で隣接して含まれているレコードにマッチします。つまり、 `Put a search keyword in the form` にはマッチしますが、 `Search by the keyword` や `There is a keyword. Search by it!` にはマッチしません。

以下は簡単な使用例です。

実行例:

    select Entries --match_columns content --query '"I started"'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ]
    #     ]
    #   ]
    # ]

この式は `content` カラムの値に `I started` というフレーズを含んでいるレコードにマッチします。 `I also started` にはマッチしません。これは `I` と `started` が隣接していないからです。

`content` カラムはデフォルトのマッチカラムです。

### 7.11.1.3.3. 全文検索条件（マッチカラム指定あり）

構文は `column:@keyword` です。

これは `全文検索条件` と似ていますが、デフォルトのマッチカラムは必要ありません。全文検索用のマッチカラムは select の `--match_columns` オプションではなく `column:` で指定します。

この条件式は異なったカラムに対して複数の全文検索をしたい場合に便利です。 `--match_columns` オプションで指定するデフォルトのマッチカラムは複数回指定することができません。2つめのマッチカラムを指定するためにはこの条件式を使う必要があります。

`全文検索条件` と `全文検索条件（マッチカラム指定あり）` の違いは高度なマッチカラムをサポートしているかどうかです。 `全文検索条件` は高度なマッチカラムをサポートしていますが、 `全文検索条件（マッチカラム指定あり）` はサポートしていません。高度なマッチカラムには以下の機能があります:

> - 重みをサポートしている。

> - 複数のカラムを指定できる。

> - マッチカラムとしてインデックスカラムを使える。

これらについては select の `--match_columns` オプションを参照してください。

以下は簡単な使用例です。

実行例:

    select Entries --query content:@fast
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]

この式は `content` カラムの値に `fast` という単語を含んでいるレコードにマッチします。

### 7.11.1.3.4. フレーズ検索条件（マッチカラム指定あり）

構文は `column:@"search keyword"` です。

これは `フレーズ検索条件` に似ていますが、デフォルトのマッチカラムは必要ありません。フレーズ検索用のマッチカラムは select の `--match_columns` オプションではなく `column:` で指定します。

`フレーズ検索条件` と `フレーズ検索条件（マッチカラム指定あり）` は `全文検索条件` と `全文検索条件（マッチカラム指定あり）` の関係と似ています。 `フレーズ検索条件` は高度なマッチカラムをサポートしていますが、 `フレーズ検索条件（マッチカラム指定あり）` はサポートしていません。高度なマッチカラムについては `全文検索条件（マッチカラム指定あり）` を参照してください。

以下は簡単な使用例です。

実行例:

    select Entries --query 'content:@"I started"'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ]
    #     ]
    #   ]
    # ]

この式は `content` カラムの値に `I started` というフレーズを含んでいるレコードにマッチします。 `I also started` にはマッチしません。これは `I` と `started` が隣接していないからです。

### 7.11.1.3.5. 前方一致検索条件

構文は `column:^value` または `value*` です。

この条件式は `value` で前方一致検索をします。前方一致検索は `value` で始まる単語を含むレコードを検索します。

カラムの値を高速に前方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルをパトリシアトライ（ `TABLE_PAT_KEY` ）またはダブル配列トライ（ `TABLE_DAT_KEY` ）にしなければいけません。あるいは、パトリシアトライテーブルまたはダブル配列テーブルの `_key` も高速に前方一致検索できます。 `_key` にインデックスを作成する必要はありません。

他の種類のテーブルでも前方一致検索を使えますがレコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query '_key:^Goo'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         5,
    #         "Good-bye Tritonn",
    #         "I also migrated all Tritonn system!",
    #         3
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ]
    #     ]
    #   ]
    # ]

この式は `_key` カラムの値が `Goo` で始まる単語を含むレコードにマッチします。この式には `Good-bye Senna` と `Good-bye Tritonn` がマッチします。

### 7.11.1.3.6. 後方一致検索条件

構文は `column:$value` です。

この条件式は `value` で後方一致検索します。後方一致検索は `value` で終わる単語を含むレコードを検索します。

カラムの値を高速に後方一致検索できます。ただし、そのカラムにはインデックスを作成し、そのインデックス用のテーブルを `KEY_WITH_SIS` フラグ付きのパトリシアトライテーブル（ `TABLE_PAT_KEY` ）にしなければいけません。 `KEY_WITH_SIS` フラグ付きのパトリシアトライテーブル（ `TABLE_PAT_KEY` ）の `_key` 擬似カラムの値も高速に後方一致検索できます。 `_key` にはインデックスを作成する必要はありません。 `_key` ベースの高速な後方一致検索よりもカラムベースの高速な後方一致検索を使うことをおすすめします。 `_key` ベースの高速な後方一致検索は自動的に登録された部分文字列も返ってきます。（TODO: 後方一致検索に関するドキュメントを書いてここからリンクを張る。）

注釈

高速な後方一致検索は日本語のひらがななど非ASCII文字にしか使えません。ASCII文字には高速な後方一致検索を使えません。

後方一致検索は他の種類のテーブルもしくはパトリシアトライを `KEY_WITH_SIS` フラグなしで使用しているテーブルに対しても使えますが、レコード全件を処理します。レコード数が少ない場合には問題ありませんが、レコード数が多いと時間がかかります。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

簡単な例です。ASCII文字ではない文字である日本語のひらがなに対して高速な後方一致検索をしています。

実行例:

    table_create Titles TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Titles content COLUMN_SCALAR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create SuffixSearchTerms TABLE_PAT_KEY|KEY_WITH_SIS ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create SuffixSearchTerms index COLUMN_INDEX Titles content
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table Titles
    [
    {"content": "ぐるんが"},
    {"content": "むるんが"},
    {"content": "せな"},
    {"content": "とりとん"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]
    select Titles --query 'content:$んが'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "content",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         2,
    #         "むるんが"
    #       ],
    #       [
    #         1,
    #         "ぐるんが"
    #       ]
    #     ]
    #   ]
    # ]

この式は `content` カラムの値が `んが` で終わるレコードにマッチします。この場合は `ぐるんが` と `むるんが` にマッチします。

### 7.11.1.3.7. 等価条件

構文は `column:value` です。

`column` の値が `value` と等しいレコードにマッチします。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query _key:Groonga
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ]
    #     ]
    #   ]
    # ]

この式は `_key` カラムの値が `Groonga` のレコードにマッチします。

### 7.11.1.3.8. 不等価条件

構文は `column:!value` です。

`column` の値が `value` と等しくないレコードにマッチします。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query _key:!Groonga
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         4
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ],
    #       [
    #         5,
    #         "Good-bye Tritonn",
    #         "I also migrated all Tritonn system!",
    #         3
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ],
    #       [
    #         1,
    #         "The first post!",
    #         "Welcome! This is my first post!",
    #         5
    #       ]
    #     ]
    #   ]
    # ]

この式は `_key` カラムの値が `Groonga` ではないレコードにマッチします。

### 7.11.1.3.9. 小なり条件

構文は `column:<value` です。

`column` の値が `value` 未満のレコードにマッチします。

`column` の型が `Int32` などの数値型の場合、 `column` の値と `value` は数値として比較します。もし、 `column` の型が `ShortText` のような文字列型の場合は `column` の値と `value` はビット列として比較します。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query n_likes:<10
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         3
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ],
    #       [
    #         5,
    #         "Good-bye Tritonn",
    #         "I also migrated all Tritonn system!",
    #         3
    #       ],
    #       [
    #         1,
    #         "The first post!",
    #         "Welcome! This is my first post!",
    #         5
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` より小さいレコードにマッチします。

### 7.11.1.3.10. 大なり条件

構文は `column:>value` です。

`column` の値が `value` より大きいレコードにマッチします。

`column` の型が `Int32` などの数値型の場合、 `column` の値と `value` は数値として比較します。もし、 `column` の型が `ShortText` のような文字列型の場合は `column` の値と `value` はビット列として比較します。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query n_likes:>10
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` より大きいレコードにマッチします。

### 7.11.1.3.11. 以下条件

構文は `column:<=value` です。

`column` の値が `value` 以下のレコードにマッチします。

`column` の型が `Int32` などの数値型の場合、 `column` の値と `value` は数値として比較します。もし、 `column` の型が `ShortText` のような文字列型の場合は `column` の値と `value` はビット列として比較します。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query n_likes:<=10
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         4
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ],
    #       [
    #         5,
    #         "Good-bye Tritonn",
    #         "I also migrated all Tritonn system!",
    #         3
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ],
    #       [
    #         1,
    #         "The first post!",
    #         "Welcome! This is my first post!",
    #         5
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` 以下のレコードにマッチします。

### 7.11.1.3.12. 以上条件

構文は `column:>=value` です。

`column` の値が `value` 以上のレコードにマッチします。

`column` の型が `Int32` などの数値型の場合、 `column` の値と `value` は数値として比較します。もし、 `column` の型が `ShortText` のような文字列型の場合は `column` の値と `value` はビット列として比較します。

`全文検索条件` や `フレーズ検索条件` と異なり、デフォルトのマッチカラムは必要ありません。

以下は簡単な使用例です。

実行例:

    select Entries --query n_likes:>=10
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` 以上のレコードにマッチします。

## 7.11.1.4. 結合式

以下は利用可能な結合式のリストです。

### 7.11.1.4.1. 論理和

構文は `a OR b` です。

`a` と `b` は条件式または結合式または代入式です。

`a` と `b` のうち少なくともひとつの式がマッチすれば `a OR b` はマッチします。

以下は簡単な使用例です。

実行例:

    select Entries --query 'n_likes:>10 OR content:@senna'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` より大きいか `content` カラムの値に `senna` という単語を含んでいるレコードにマッチします。

### 7.11.1.4.2. 論理積

構文は `a + b` です。あるいは単に `a b` と書くこともできます。

`a` と `b` は条件式または結合式または代入式です。

`a` と `b` の両方にマッチすれば `a + b` はマッチします。

`+a` というように最初の式に `+` を指定することもできます。この場合は `+` は単に無視されます。

以下は簡単な使用例です。

実行例:

    select Entries --query 'n_likes:>=10 + content:@groonga'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` 以上で `content` カラムの値に `groonga` という単語を含むレコードにマッチします。

### 7.11.1.4.3. 論理否定

構文は `a - b` です。

`a` と `b` は条件式または結合式または代入式です。

`a` にマッチして `b` にマッチしなければ、 `a - b` はマッチします。

`-a` というように最初の式に `-` を指定することはできません。この場合は構文エラーになります。

以下は簡単な使用例です。

実行例:

    select Entries --query 'n_likes:>=10 - content:@groonga'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]

この式は `n_likes` カラムの値が `10` 以上で `content` カラムの値に `groonga` という単語を含まないレコードにマッチします。

### 7.11.1.4.4. グループ化

構文は `(...)` です。 `...` は空白区切りの式のリストです。

`(...)` は1つ以上の式をグループ化します。グループ化された式は1つの式として処理されます。 `a b OR c` は `a` と `b` の両方がマッチするか、 `c` がマッチすれば式全体がマッチする、という意味になります。 `a (b OR c)` は `a` がマッチして `b` と `c` はどちらか一方がマッチすれば式全体がマッチする、という意味になります。

以下は簡単な使用例です。

実行例:

    select Entries --query 'n_likes:<5 content:@senna OR content:@fast'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         3
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ],
    #       [
    #         2,
    #         "Groonga",
    #         "I started to use groonga. It's very fast!",
    #         10
    #       ],
    #       [
    #         3,
    #         "Mroonga",
    #         "I also started to use mroonga. It's also very fast! Really fast!",
    #         15
    #       ]
    #     ]
    #   ]
    # ]
    select Entries --query 'n_likes:<5 (content:@senna OR content:@fast)'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "content",
    #           "Text"
    #         ],
    #         [
    #           "n_likes",
    #           "UInt32"
    #         ]
    #       ],
    #       [
    #         4,
    #         "Good-bye Senna",
    #         "I migrated all Senna system!",
    #         3
    #       ]
    #     ]
    #   ]
    # ]

最初の式はグループ化していません。この式は `n_likes:<5` と `content:@senna` の両方がマッチするか `content:@fast` がマッチするレコードにマッチします。

2番目の式はグループ化しています。この式は `n_likes:<5` にマッチして、 `content:@senna` と `content:@fast` は少なくともどちらか一方にマッチするレコードにマッチします。

## 7.11.1.5. 代入式

このセクションは高度なユーザー向けです。それは、代入式は select の `--query` オプションではデフォルトでは無効になっているからです。代入式を有効にするには `--query_flags` オプションに `ALLOW_COLUMN|ALLOW_UPDATE` を指定してください。

クエリー構文における代入式にはいくつか制限があります。代入にはクエリー構文の代りに スクリプト構文 を使ってください。

代入式の構文は1つだけです。 `column:=value` となります。

`value` は `column` に代入されます。 `value` は常にクエリー構文では文字列として扱われます。 `value` は `column` の型へと自動的にキャストされます。 キャストにはいくつか制限があります。例えば `true` や `false` といった真偽値のリテラルを `Bool` 型のカラムに使用することができません。 `false` については空文字列を使う必要がありますが、クエリー構文は `column:=` 構文をサポートしていません。

キャストについては Cast を参照してください。