[groonga-dev,04980] [ANN] Groonga 12.0.3

Back to archive index
Horimoto Yasuhiro horim****@clear*****
2022年 4月 29日 (金) 21:52:10 JST


こんばんは、堀本です。

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 が原因でマッチするはずのレコードを返さないことがあります。



groonga-dev メーリングリストの案内
Back to archive index