こんにちは、堀本です。 Groonga 12.0.2 をリリースしました! https://groonga.org/ja/docs/news.html#release-12-0-2 変更点一覧: https://groonga.org/ja/blog/2022/03/29/groonga-12.0.2.html ## 主な変更内容 ### 改良 * [logical_range_filter] シャードを処理した直後に参照を減らすようにしました。 今までGroongaは、 logical_range_filter 終了時にすべてのシャードの参照を減らしていましたが、この機能によって、 Groongaは、シャードを処理した後すぐに参照を減らします。 この機能によって、 logical_range_filter 実行中のメモリー使用量を削減できることがあります。 この機能は参照カウントモードのときのみ有効です。 GRN_ENABLE_REFERENCE_COUNT=yes と設定することで、参照カウントモードを有効にできます。 通常、Groongaは一度でも開いたオブジェクト(テーブル、カラム、インデックスなど)をメモリ上に保持し続けますが、 たくさんのオブジェクトを開いた場合、Groongaはたくさんのメモリーを使用します。 参照カウントモードでは、どこからも参照されてないオブジェクトをメモリーから開放します。 これにより、Groongaのメモリー使用量が減ることがあります。 * クラッシュリカバリー機能の安定性が向上しました。 この機能は実験的で、デフォルトで無効です。したがって、以下の改良は。一般的なユーザーには影響ありません。 * Groongaがクラッシュしたときにインデックスが破損する問題を修正しました。 * ロックが残留する問題を修正しました。 * クラッシュリカバリー中にGroongaがクラッシュする問題を修正しました。 * 無名マッピングが利用可能な時のmmapのパフォーマンスを向上しました。 この改善によって、Groongaのパフォーマンスが少し向上します。 * [インデックス構築] 以下のタイプのカラムで静的インデックス構築をサポートしました。サポートしました。 * 非参照重み付きベクターカラム * 参照重み付きベクターカラム * 参照スカラーカラム これらのカラムは、いままで、静的インデックス構築をサポートしていませんでした。 そのため、これらのカラムにデータをロードしたあとに、インデックスを構築しても、インデックスの構築時間が長くなっていました。 この改良によって、このケースでインデックス構築時間が短くなります。 * [column_create] 新しいフラグ MISSING_* と INVALID_* を追加しました。 column_create に以下の新しいフラグを追加しました。 MISSING_ADD MISSING_IGNORE MISSING_NIL INVALID_ERROR INVALID_WARN INVALID_IGNORE 通常、データカラムが参照データカラムで存在しないキーを指定された場合、自動的に存在しないキーを作成し、新しいレコードを作ります。 このGroongaが参照先のカラムにキーを自動的に追加する挙動は、タグ検索のような検索で便利です。 Groongaがロード時に自動的にデータを追加してくれるためです。 しかしながら、この挙動は、キー以外の値が必要な場合に不便です。キーしか存在しないレコードがあるためです。 このリリースで追加したフラグを使ってこの挙動を変更できます。 MISSING_ADD: デフォルト値です。現在と同じ挙動になります。 データカラムが参照データカラムで、存在しないキーを指定された場合、自動的にキーを作成し、新しいレコードを追加します。 MISSING_IGNORE: データカラムが参照データカラムで、存在しないキーを指定された場合、存在しないキーを無視します。 参照データカラムがスカラーカラムの場合、値は GRN_ID_NIL になります。 参照データカラムがベクターカラムの場合、以下のようにその要素のみを無視します。 ["existent1", "nonexistent", "existent2"] -> ["existent1" "existent2"] MISSING_NIL: データカラムが参照データカラムで、存在しないキーを指定された場合、スカラーカラムとベクターカラムは存在しないキーを GRN_ID_NIL として扱います。 ["existent1", "nonexistent", "existent2"] -> ["existent1", "" (GRN_ID_NIL), "existent2"] INVALID_ERROR: デフォルト値です。 ベクターカラムのエラー応答を除いて、現在と同じ挙動になります。 無効な値を設定した場合(e.g.: XXX for UInt8 scalar column)、設定操作をエラーとして扱います。 データカラムがスカラーカラムの場合、 load は応答とログにエラーを報告します。 データカラムがベクターカラムの場合、 load はログにエラーを報告しますが、応答にエラーを報告しません。これは非互換の変更です。 INVALID_WARN: 無効な値を設定した場合(e.g.: XXX for UInt8 scalar column)、警告メッセージをログに記録し、設定操作を無視します。 対象のデータカラムが参照ベクターカラムの場合、MISSING_IGNORE と MISSING_NIL を使って挙動を決定します。 INVALID_IGNORE: 無効な値を設定した場合(e.g.: XXX for UInt8 scalar column)、設定操作を無視します。 対象のデータカラムが参照ベクターカラムの場合、MISSING_IGNORE と MISSING_NIL を使って挙動を決定します。 * [dump][column_list] MISSING_* と INVALID_* フラグをサポートしました。 これらのコマンドは、後方互換性を維持するため、 MISSING_ADD と INVALID_ERROR フラグを表示しません。 これらのフラグはデフォルトの挙動を表すためです。 * [schema] MISSING_* と INVALID_* フラグをサポートしました。 後方互換性を維持するため、 MISSING_AND と INVALID_ERROR フラグを flag に表示しませんがそれぞれのカラムに、 新しく missing と invalid キーが追加されます。 * Amazon Linux 2向けのパッケージを提供するようにしました。 * [Windows] Visual Studio 2017 でのビルドをやめました。 * GitHub Actionsで windows-2016 のイメージが使えなくなったためです。 ### 既知の問題 * 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。 * *< と *> は、filter条件の右辺に query() を使う時のみ有効です。 もし、以下のように指定した場合、 *< と *> は && として機能します。 'content @ "Groonga" *< content @ "Mroonga"' * GRN_II_CURSOR_SET_MIN_ENABLE が原因でマッチするはずのレコードを返さないことがあります。