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

8.10.1. クエリー構文

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

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

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

8.10.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._keyEntries.content は両方とも全文検索できます。

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

8.10.1.2. エスケープ

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

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

  • [space][backquote][space] とエスケープする。)( [space] をASCIIで言えば0x20の空白文字に置き換えて、 [backquote]\\ に置き換えてください。)

  • "\" とエスケープする。)

  • '\' とエスケープする。)

  • (\( とエスケープする。)

  • )\) とエスケープする。)

  • \\\ とエスケープする。)

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

8.10.1.3. 条件式

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

8.10.1.3.1. 全文検索条件

構文は keyword です。

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

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

この条件式は keyword で全文検索をします。 keyword には空白を含めることはできません。 search keyword というように空白を含んでいる場合は、 searchkeyword という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 カラムはデフォルトのマッチカラムです。

8.10.1.3.2. フレーズ検索条件

構文は "search keyword" です。

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

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

この条件式は search keyword でフレーズ検索をします。フレーズ検索は searchkeyword がこの順番で隣接して含まれているレコードにマッチします。つまり、 Put a search keyword in the form にはマッチしますが、 Search by the keywordThere 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 にはマッチしません。これは Istarted が隣接していないからです。

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

8.10.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 という単語を含んでいるレコードにマッチします。

8.10.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 にはマッチしません。これは Istarted が隣接していないからです。

8.10.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 SennaGood-bye Tritonn がマッチします。

8.10.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 カラムの値が んが で終わるレコードにマッチします。この場合は ぐるんがむるんが にマッチします。

8.10.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 のレコードにマッチします。

8.10.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 ではないレコードにマッチします。

8.10.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 より小さいレコードにマッチします。

8.10.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 より大きいレコードにマッチします。

8.10.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 以下のレコードにマッチします。

8.10.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 以上のレコードにマッチします。

8.10.1.4. 結合式

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

8.10.1.4.1. 論理和

構文は a OR b です。

ab は条件式または結合式または代入式です。

ab のうち少なくともひとつの式がマッチすれば 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 という単語を含んでいるレコードにマッチします。

8.10.1.4.2. 論理積

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

ab は条件式または結合式または代入式です。

ab の両方にマッチすれば 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 という単語を含むレコードにマッチします。

8.10.1.4.3. 論理否定

構文は a - b です。

ab は条件式または結合式または代入式です。

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 という単語を含まないレコードにマッチします。

8.10.1.4.4. グループ化

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

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

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

実行例:

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:<5content:@senna の両方がマッチするか content:@fast がマッチするレコードにマッチします。

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

8.10.1.5. 代入式

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

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

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

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

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