7.13.1. クエリー構文¶
クエリー構文は一般的なWebの検索フォームで検索条件を指定するための構文です。Googleの検索フォームで使われている構文に似ています。例えば、 word1 word2
は word1
と word2
の両方の単語を含んだレコードを検索するという意味です。 word1 OR word2
は word1
または word2
のどちらかの単語を含んだレコードを検索します。
クエリー構文は 条件式
と 結合式
と 代入式
から成ります。通常、 代入式
は考えなくてよいです。なぜなら、 代入式
は select の --query
オプションでは無効になっているからです。groongaをライブラリとして使ったときは、クエリー構文のパーサーのオプションをカスタマイズすることで 代入式
を有効にすることができます。
条件式
は条件を指定します。 結合式
は1つ以上の 条件式
、 結合式
、 代入式
から成ります。 代入式
はカラムに値を代入します。
7.13.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 ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
# [[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.13.1.2. エスケープ¶
クエリー構文には特別な文字があります。特別な文字それ自体を使うためには文字の前に \
をつけてエスケープしなければいけません。例えば、 "
は特別な文字です。これは \"
というようにエスケープします。
以下が特別な文字のリストです:
[space]
([backslash][space]
とエスケープする。)([space]
をASCIIで言えば0x20の空白文字に置き換えて、[backslash]
を\\
に置き換えてください。)
"
(\"
とエスケープする。)
(
(\(
とエスケープする。)
)
(\)
とエスケープする。)
\
(\\
とエスケープする。)
\
(バックスラッシュ)以外はエスケープする代わりにクォートすることもできます。クォート中でバックスラッシュをエスケープするときは \\
というようにバックスラッシュを使います。
クォート構文は "..."
です。 "..."
クォート構文中では "
を \"
にエスケープする必要があります。例えば、 You say "Hello Alice!"
は "You say \"Hello Alice!\""
とクォートします。
なお、 '...'
はクエリー構文では使えません。
注釈
注意しなければならない大事な点があります。\
(バックスラッシュ)はコマンドラインシェルが解釈します。それゆえ例えば (
それ自体を検索したいならシェルでは二重にエスケープ (\\(
) しなければなりません。コマンドラインシェルは \\(
を \(
と解釈してからGroongaに渡します。Groongaは \(
を (
とみなし、(
自体をデータベースから検索します。もし意図した検索がGroongaで行えないなら、特別な文字を正しくエスケープしているか確認します。
7.13.1.3. 条件式¶
以下は利用可能な条件式の一覧です。
7.13.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.13.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.13.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.13.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.13.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.13.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.13.1.3.7. 近傍検索条件¶
TODO: *N"word1 word2 ..."
7.13.1.3.8. 近傍フレーズ検索条件¶
TODO: *NP"phrase1 phrase2 ..."
7.13.1.3.9. 類似文書検索条件¶
TODO
7.13.1.3.10. 等価条件¶
構文は 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.13.1.3.11. 不等価条件¶
構文は 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.13.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
# ],
# [
# [
# [
# 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.13.1.3.13. 大なり条件¶
構文は 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.13.1.3.14. 以下条件¶
構文は 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.13.1.3.15. 以上条件¶
構文は 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.13.1.3.16. 正規表現条件¶
バージョン 5.0.1 で追加.
構文は column:~pattern
です。
column
の値が pattern
にマッチするレコードにマッチします。 pattern
は正しい 正規表現 でなければいけません。
以下の例はパターンとして .roonga
を使っています。このパターンは Groonga
、 Mroonga
といった文字列にマッチします。
実行例:
select Entries --query content:~.roonga
# [
# [
# 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
# ]
# ]
# ]
# ]
多くの場合、各レコードに対して順に正規表現を評価します。そのため、多くのレコードがある場合は遅くなるかもしれません。
いくつかのケースでは、Groongaはインデックスを使って正規表現を評価します。これはとても高速です。詳細は 正規表現 を参照してください。
7.13.1.4. 結合式¶
以下は利用可能な結合式のリストです。
7.13.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.13.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.13.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.13.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.13.1.5. 代入式¶
このセクションは高度なユーザー向けです。それは、代入式は select の --query
オプションではデフォルトでは無効になっているからです。代入式を有効にするには --query_flags
オプションに ALLOW_COLUMN|ALLOW_UPDATE
を指定してください。
クエリー構文における代入式にはいくつか制限があります。代入にはクエリー構文の代りに スクリプト構文 を使ってください。
代入式の構文は1つだけです。 column:=value
となります。
value
は column
に代入されます。 value
は常にクエリー構文では文字列として扱われます。 value
は column
の型へと自動的にキャストされます。 キャストにはいくつか制限があります。例えば true
や false
といった真偽値のリテラルを Bool
型のカラムに使用することができません。 false
については空文字列を使う必要がありますが、クエリー構文は column:=
構文をサポートしていません。
キャストについては Cast を参照してください。