BloGroonga

2022-04-29

Groonga 12.0.3リリース

Groonga 12.0.3をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

改良

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

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 12.0.3リリース

それでは、Groongaでガンガン検索してください!