こんばんは、堀本です。
Groonga 12.0.3 をリリースしました!
https://groonga.org/ja/docs/news.html#release-12-0-3
変更点一覧:
https://groonga.org/ja/blog/2022/04/29/groonga-12.0.3.html
## 主な変更内容
### 改良
* [logical_count] logical_count 実行中のメモリー使用量を改善しました。
いままで、Groongaは logical_count 実行中に確保したオブジェクト(オブジェクトとは、テーブルやカラム、インデックスなどです。)
と一時テーブルを logical_count の実行完了まで保持し続けていました。
この機能によって、Groongaは、1つのシャードを処理した後すぐに参照を減らします。
そのため、Groongaは、 logical_count の実行中にメモリーを解放できるようになり、
Groongaのメモリー使用量を削減できることがあります。
この機能は参照カウントモードのときのみ有効です。 GRN_ENABLE_REFERENCE_COUNT=yes と設定することで、
参照カウントモードを有効にできます。
加えて、Groongaは、この機能によって logical_count 実行中に一時テーブルを動的に解放します。
そのため、Groongaのメモリー使用量を削減できます。この改善は、参照カウントモードが有効でなくても効果があります。
* [dump] MISSING_IGNORE/MISSING_NIL をサポートしました。
MISSING_IGNORE/MISSING_NIL を持つカラムがある場合、これらのカラムのダンプに失敗していました。
このリリースから、 dump コマンドはこれらのカラムをサポートしました。
* [snippet],[snippet_html] 入力としてベクターをサポートしました。
例えば、以下のようにJSONデータ内のベクターに対して検索キーワードの周辺テキストを抽出できます。
table_create Entries TABLE_NO_KEY
column_create Entries title COLUMN_SCALAR ShortText
column_create Entries contents COLUMN_VECTOR ShortText
table_create Tokens TABLE_PAT_KEY ShortText --default_tokenizer TokenNgram --normalizer NormalizerNFKC130
column_create Tokens entries_title COLUMN_INDEX|WITH_POSITION Entries title
column_create Tokens entries_contents COLUMN_INDEX|WITH_SECTION|WITH_POSITION Entries contents
load --table Entries
[
{
"title": "Groonga and MySQL",
"contents": [
"Groonga is a full text search engine",
"MySQL is a RDBMS",
"Mroonga is a MySQL storage engine based on Groonga"
]
}
]
select Entries\
--output_columns 'snippet_html(contents), contents'\
--match_columns 'title'\
--query Groonga
[
[
0,
0.0,
0.0
],
[
[
[
1
],
[
[
"snippet_html",
null
],
[
"contents",
"ShortText"
]
],
[
[
"<span class=\"keyword\">Groonga</span> is a full text search engine",
"Mroonga is a MySQL storage engine based on <span class=\"keyword\">Groonga</span>"
],
[
"Groonga is a full text search engine",
"MySQL is a RDBMS",
"Mroonga is a MySQL storage engine based on Groonga"
]
]
]
]
]
今までも、 --output_columns 'snippet_html(contents[1])' のように snippet*
を指定することで以下のようにベクターに対して検索キーワードの周辺テキストを抽出できますが、
この方法ではどの要素を出力すればよいかわかりません。どの要素が検索にヒットしたかわからないためです。
select Entries\
--output_columns 'snippet_html(contents[0]), contents'\
--match_columns 'title'\
--query Groonga
[
[
0,
0.0,
0.0
],
[
[
[
1
],
[
[
"snippet_html",
null
],
[
"contents",
"ShortText"
]
],
[
[
"<span class=\"keyword\">Groonga</span> is a full text search engine"
],
[
"Groonga is a full text search engine",
"MySQL is a RDBMS",
"Mroonga is a MySQL storage engine based on Groonga"
]
]
]
]
]
* [vector_join] 新しい関数 vector_join() を追加しました。
この関数は各要素を結合します。この関数の第二引数で区切り文字を指定できます。
例えば、以下のようにベクターに対して snippet() や snippet_html() を実行できます。
plugin_register functions/vector
table_create Entries TABLE_NO_KEY
column_create Entries title COLUMN_SCALAR ShortText
column_create Entries contents COLUMN_VECTOR ShortText
table_create Tokens TABLE_PAT_KEY ShortText --default_tokenizer TokenNgram --normalizer NormalizerNFKC130
column_create Tokens entries_title COLUMN_INDEX|WITH_POSITION Entries title
column_create Tokens entries_contents COLUMN_INDEX|WITH_SECTION|WITH_POSITION Entries contents
load --table Entries
[
{
"title": "Groonga and MySQL",
"contents": [
"Groonga is a full text search engine",
"MySQL is a RDBMS",
"Mroonga is a MySQL storage engine based on Groonga"
]
}
]
select Entries\
--output_columns 'snippet_html(vector_join(contents, "\n")), contents'\
--match_columns 'title'\
--query Groonga --output_pretty yes
[
[
0,
1650849001.524027,
0.0003361701965332031
],
[
[
[
1
],
[
[
"snippet_html",
null
],
[
"contents",
"ShortText"
]
],
[
[
"<span class=\"keyword\">Groonga</span> is a full text search engine\nMySQL is a RDBMS\nMroonga is a MySQL storage engine based on <span class=\"keyword\">Groonga</span>"
],
[
"Groonga is a full text search engine","MySQL is a RDBMS","Mroonga is a MySQL storage engine based on Groonga"
]
]
]
]
]
* [インデックス構築] 動的インデックス構築のようにとても大きなトークンを無視するようにしました。
Groongaはエラーを発生しなくなり、静的インデックス構築を実行する時に大きなトークンを無視し警告を出力します。
### 修正
* パトリシアトライのテーブルにキーを追加できなくなることがある問題を修正しました。
この問題は、以下の条件で発生します。
* パトリシアトライのテーブルにすでにキーがある場合。
* 4096バイトのキーを追加する場合。
### 既知の問題
* 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。
* *< と *> は、filter条件の右辺に query() を使う時のみ有効です。もし、以下のように指定した場合、 *< と *> は && として機能します。
'content @ "Groonga" *< content @ "Mroonga"'
* GRN_II_CURSOR_SET_MIN_ENABLE が原因でマッチするはずのレコードを返さないことがあります。