こんにちは。堀本です。
Groonga 11.0.4 をリリースしました!
https://groonga.org/ja/docs/news.html#release-11-0-4
変更点一覧:
https://groonga.org/ja/blog/2021/06/29/groonga-11.0.4.html
## 主な変更内容
* [Normalizer] カスタマイズされたノーマライザーを使えるようになりました。
* 新しいコマンド object_warm を追加しました。
このコマンドは、GroongaのDBをOSのページキャッシュに乗せます。
OS起動後、Groongaを一度も起動していない場合、GroongaのDBはOSのページキャッシュ上に存在しません。
そのため、Groongaに対する最初の操作は遅くなります。
予めこのコマンドを実行した場合、Groongaへの最初の操作は速くなります。
Linuxでは、 cat *.db > dev/null で同等のことができますが、Windowsでは、いままで同様のことはできませんでした。
このコマンドを使うことで、LinuxでもWindowsでもGroongaのDBをOSのページキャッシュへ乗せることができます。
また、テーブル、カラム、インデックス単位でも同様のことができます。
したがって、よく使うテーブルやカラム、インデックスのみをOSのページキャッシュに乗せることができます。
* [select] --filter 内で特定のレコードのスコアーを調整できるようにしました。
*~ という演算子を使うことで、特定のレコードのスコアーを調整できます。
*~ は && や || と同じ論理演算子です。したがって、 && や || と同じように使えます。
*~ のデフォルトの重みは -1 です。
したがって、例えば、 'content @ "Groonga" *~ content @ "Mroonga"' は以下の操作を意味します。
1. 'content @ "Groonga" と content @ "MySQL" にマッチしたレコードを抽出します。
2. 以下のようにスコアーを追加します。
a. 'content @ "Groonga"' のスコアーを計算します。
b. 'content @ "Mroonga"' のスコアーを計算します。
c. bのスコアーを -1 倍します。
d. このレコードのスコアーは a + b です。したがって、 aのスコアー 1 で bのスコアーが1 の場合、
このレコードのスコアーは 1 + (1 * -1) = 0 です。
また、 *~${score_quantity} とすることで、スコアーの量を指定できます。
具体的には、 以下の条件( 'content @ "Groonga" *~2.5 content @ "MySQL"' ) にマッチしたレコードのスコアーを調整します。
table_create Memos TABLE_NO_KEY
column_create Memos content COLUMN_SCALAR ShortText
table_create Terms TABLE_PAT_KEY ShortText \
--default_tokenizer TokenBigram \
--normalizer NormalizerAuto
column_create Terms index COLUMN_INDEX|WITH_POSITION Memos content
load --table Memos
[
{"content": "Groonga is a full text search engine."},
{"content": "Rroonga is the Ruby bindings of Groonga."},
{"content": "Mroonga is a MySQL storage engine based of Groonga."}
]
select Memos \
--command_version 3 \
--filter 'content @ "Groonga" *~2.5 content @ "Mroonga"' \
--output_columns 'content, _score' \
--sort_keys -_score,_id
{
"header": {
"return_code": 0,
"start_time": 1624605205.641078,
"elapsed_time": 0.002965450286865234
},
"body": {
"n_hits": 3,
"columns": [
{
"name": "content",
"type": "ShortText"
},
{
"name": "_score",
"type": "Float"
}
],
"records": [
[
"Groonga is a full text search engine.",
1.0
],
[
"Rroonga is the Ruby bindings of Groonga.",
1.0
],
[
"Mroonga is a MySQL storage engine based of Groonga.",
-1.5
]
]
}
}
[adjuster] を使っても同様のことができます。[adjuster] を使う場合、アプリケーション上で、
--filter 条件と --adjuster 条件を作る必要がありますが、この改良で、 --filter 条件のみを
作成すればよくなりました。
以下のように、 query() を使って、filter条件を記述することもできます。
* --filter 'content @ "Groonga" *~2.5 content @ "Mroonga"'
* [select] 重み付き && をサポートしました。
*< と *> を使うことで、重み付きの && を使えます。 *< のデフォルトの重みは 0.5です。
*> のデフォルトの重みは 2.0 です。
*<${score_quantity} や *>${score_quantity} とすることで、スコアーの量を指定できます。
また、 *<${score_quantity} と指定した場合は、 ${score_quantity} の正負の符号が反転します。
例えば、 'content @ "Groonga" *<2.5 query("content", "MySQL")' は以下の操作を意味します。
1. 'content @ "Groonga" と content @ "MySQL" にマッチしたレコードを抽出します。
2. 以下のようにスコアーを追加します。
a. 'content @ "Groonga"' のスコアーを計算します。
b. 'query("content", "MySQL") のスコアーを計算します。
c. bのスコアーは、 *< によって -2.5倍されます。
d. このレコードのスコアーは a + b です。したがって、 aのスコアー 1 で bのスコアーが1 の場合、
このレコードのスコアーは 1 + (1 * -2.5) = −1.5 です。
具体的には、 以下の条件( 'content @ "Groonga" *~2.5 query("content", "MySQL")' )
にマッチしたレコードのスコアーを調整します。
table_create Memos TABLE_NO_KEY
column_create Memos content COLUMN_SCALAR ShortText
table_create Terms TABLE_PAT_KEY ShortText \
--default_tokenizer TokenBigram \
--normalizer NormalizerAuto
column_create Terms index COLUMN_INDEX|WITH_POSITION Memos content
load --table Memos
[
{"content": "Groonga is a full text search engine."},
{"content": "Rroonga is the Ruby bindings of Groonga."},
{"content": "Mroonga is a MySQL storage engine based of Groonga."}
]
select Memos \
--command_version 3 \
--filter 'content @ "Groonga" *<2.5 query("content", "Mroonga")' \
--output_columns 'content, _score' \
--sort_keys -_score,_id
{
"header": {
"return_code": 0,
"start_time": 1624605205.641078,
"elapsed_time": 0.002965450286865234
},
"body": {
"n_hits": 3,
"columns": [
{
"name": "content",
"type": "ShortText"
},
{
"name": "_score",
"type": "Float"
}
],
"records": [
[
"Groonga is a full text search engine.",
1.0
],
[
"Rroonga is the Ruby bindings of Groonga.",
1.0
],
[
"Mroonga is a MySQL storage engine based of Groonga.",
-1.5
]
]
}
}
* [Log] 標準出力、標準エラー出力への出力をサポートしました。
[プロセスログ] と [クエリーログ] が標準出力と標準エラー出力への出力をサポートしました。
* --log-path - や --query-log-path - と指定した場合、Groongaはログを標準出力に出力します。
* --log-path + や --query-log-path + と指定した場合、Groongaはログを標準エラー出力に出力します。
[プロセスログ] は、Groongaの動作全てに関することのログです。[クエリーログ] は、クエリー処理に関することだけのログです。
この機能はDocker上でGroongaを実行する際に有用です。
Dockerは標準で標準出力と標準エラー出力を記録する機能を持っています。したがって、Groongaのログを取得するために、
Dockerの環境にログインする必要がなくなります。
* [ドキュメント] string_substring に不足している内容を追加しました。
### 既知の問題
* 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。
* [ブラウザーベースの管理ツール] 現在Groongaには、レコード一覧の管理モードのチェックボックスにチェックを入れても、
非管理モードに入力された検索クエリーが送信されるという問題があります。
* *< と *> は、filter条件の右辺に query() を使う時のみ有効です。もし、以下のように指定した場合、
*< と *> は && として機能します。
* 'content @ "Groonga" *< content @ "Mroonga"'