BloGroonga

2021-03-31

Groonga 11.0.1リリース

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

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

変更内容

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

改良

  • Debian GNU/Linux ARM64向けのパッケージをサポートしました。

  • select キーワードごとに重みをカスタマイズできるようにしました。

    • 今まで、スコアーを調整するには、すべてのキーワードに対して <> を指定する必要がありました。デフォルトのスコアの重み(1)より、デフォルトの重みの調整量(6 または 4)のほうが大きいためです。
    • 例えば、 A <B では、 "A" の重みは1、 "B" の重みは4になります。デクリメントされていない "A" の重み(1)より、デクリメントされた "B" の重み(4)のほうが大きくなります。これは、期待した動作ではありません。"B" に "A" より小さい重みを使うためには、 >A <B と指定する必要があります。 >A <B では、 "A" の重みは6、 "B" の重みは4になります。
    • 今回のリリースから、対象のキーワードに <${WEIGHT} または >${WEIGHT} と指定するだけで、キーワードごとに重みの調整量をカスタマイズできます。例えば、 A <0.1B では、 "A" の重みは1、 "B" の重みは0.9になります。("B" の重みを0.1デクリメントしています。)
    • ただし、これらの形式( >${WEIGHT}...<${WEIGHT}...~${WEIGHT}... )は互換性が無いことに注意してください。
  • select Apache Arrow形式で FloatFloat32 の値を出力できるようにしました。

  • select 結果出力時に、インデックスカラム経由で参照先のデータを取得できるようになりました。

    • 今までは、 出力値に index_column.xxx のように指定すると、Groongaは意図しない値を返していました。例えば以下の例では、 --columns[tags].value purchases.tag の値は、 ["apple",["many"]],["banana",["man"]],["cacao",["man"]] になりました。このケースでは、期待される値は、 ["apple",["man","many"]],["banana",["man"]],["cacao",["woman"]] でした。今回のリリースから、以下のように、インデックスカラム経由で参照先の正しい値を取得できます。

      table_create Products TABLE_PAT_KEY ShortText
      
      table_create Purchases TABLE_NO_KEY
      column_create Purchases product COLUMN_SCALAR Products
      column_create Purchases tag COLUMN_SCALAR ShortText
      
      column_create Products purchases COLUMN_INDEX Purchases product
      
      load --table Products
      [
      {"_key": "apple"},
      {"_key": "banana"},
      {"_key": "cacao"}
      ]
      
      load --table Purchases
      [
      {"product": "apple",  "tag": "man"},
      {"product": "banana", "tag": "man"},
      {"product": "cacao",  "tag": "woman"},
      {"product": "apple",  "tag": "many"}
      ]
      
      select Products \
        --columns[tags].stage output \
        --columns[tags].flags COLUMN_VECTOR \
        --columns[tags].type ShortText \
        --columns[tags].value purchases.tag \
        --output_columns _key,tags
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              3
            ],
            [
              [
                "_key",
                "ShortText"
              ],
              [
                "tags",
                "ShortText"
              ]
            ],
            [
              "apple",
              [
                "man",
                "many"
              ]
            ],
            [
              "banana",
              [
                "man"
              ]
            ],
            [
              "cacao",
              [
                "woman"
              ]
            ]
          ]
        ]
      ]
      
  • select ネストされたインデックスの一部として直接インデックスカラムを指定できるようになりました。

    • index_column.except_source_column を使ってフィルター後にソーステーブルを検索できます。例えば、以下の例では、検索時に comments.content を指定しています。この場合、最初に、このクエリは Comments テーブルの content カラムを全文検索し、次に Comments テーブルを検索した結果のレコードを参照する Articles テーブルのレコードを取得します。

      table_create Articles TABLE_HASH_KEY ShortText
      
      table_create Comments TABLE_NO_KEY
      column_create Comments article COLUMN_SCALAR Articles
      column_create Comments content COLUMN_SCALAR ShortText
      
      column_create Articles content COLUMN_SCALAR Text
      column_create Articles comments COLUMN_INDEX Comments article
      
      table_create Terms TABLE_PAT_KEY ShortText \
        --default_tokenizer TokenBigram \
        --normalizer NormalizerNFKC130
      column_create Terms articles_content COLUMN_INDEX|WITH_POSITION \
        Articles content
      column_create Terms comments_content COLUMN_INDEX|WITH_POSITION \
        Comments content
      
      load --table Articles
      [
      {"_key": "article-1", "content": "Groonga is fast!"},
      {"_key": "article-2", "content": "Groonga is useful!"},
      {"_key": "article-3", "content": "Mroonga is fast!"}
      ]
      
      load --table Comments
      [
      {"article": "article-1", "content": "I'm using Groonga too!"},
      {"article": "article-3", "content": "I'm using Mroonga!"},
      {"article": "article-1", "content": "I'm using PGroonga!"}
      ]
      
      select Articles --match_columns comments.content --query groonga \
        --output_columns "_key, _score, comments.content
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              1
            ],
            [
              [
                "_key",
                "ShortText"
              ],
              [
                "_score",
                "Int32"
              ],
              [
                "comments.content",
                "ShortText"
              ]
            ],
            [
              "article-1",
              1,
              [
                "I'm using Groonga too!",
                "I'm using PGroonga!"
              ]
            ]
          ]
        ]
      ]
      
  • load オブジェクトリテラルを使って、参照先のレコードをロードできるようにしました。

    • 例えば、以下のように、 "key" : "[ { "key" : "value", ..., "key" : "value" } ]" のようなデータをロードできます。

      table_create Purchases TABLE_NO_KEY column_create Purchases item COLUMN_SCALAR ShortText column_create Purchases price COLUMN_SCALAR UInt32

      table_create Settlements TABLE_HASH_KEY ShortText column_create Settlements purchases COLUMN_VECTOR Purchases column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases

      load –table Settlements [ { "_key": "super market", "purchases": [ {"item": "apple", "price": 100}, {"item": "milk", "price": 200} ] }, { "_key": "shoes shop", "purchases": [ {"item": "sneakers", "price": 3000} ] } ] ```

    • この機能によって、参照カラムにJSONデータを追加しやすくなります。
    • 現状、この機能は、JSONの入力のみをサポートしています。
  • load JSON文字列で、参照先のレコードをロードできるようにしました。

    • 以下のように、JSONテキストを使ってソーステーブルから参照ベクターへデータをロードできます。

      table_create Purchases TABLE_HASH_KEY ShortText
      column_create Purchases item COLUMN_SCALAR ShortText
      column_create Purchases price COLUMN_SCALAR UInt32
      
      table_create Settlements TABLE_HASH_KEY ShortText
      column_create Settlements purchases COLUMN_VECTOR Purchases
      
      column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases
      
      load --table Settlements
      [
      {
        "_key": "super market",
        "purchases": "[{\"_key\": \"super market-1\", \"item\": \"apple\", \"price\": 100}, {\"_key\": \"super market-2\", \"item\": \"milk\",  \"price\": 200}]"
      },
      {
        "_key": "shoes shop",
        "purchases": "[{\"_key\": \"shoes shop-1\", \"item\": \"sneakers\", \"price\": 3000}]"
      }
      ]
      
      dump \
        --dump_plugins no \
        --dump_schema no
      load --table Purchases
      [
      ["_key","item","price"],
      ["super market-1","apple",100],
      ["super market-2","milk",200],
      ["shoes shop-1","sneakers",3000]
      ]
      
      load --table Settlements
      [
      ["_key","purchases"],
      ["super market",["super market-1","super market-2"]],
      ["shoes shop",["shoes shop-1"]]
      ]
      
      column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases
      
    • 現状、この機能は、ネストされた参照レコードをサポートしていません。

  • [Windows] time_classify_* 関数で UNIXエポック を扱えるようになりました。

  • query_parallel_or クエリーを並行して実行できる新しい関数を追加しました。

  • select 存在しないソートキーを無視するようにしました。

    • 今まで、存在しないソートキーを指定したとき、Groongaはエラーを出力していましたが、今回のリリースから存在しないソートキーを無視します。(エラーを出力しなくなります。)
    • この機能は、一貫性のために実装しています。 output_columns も無効な値を無視します。また、 sort_keys も無効な値のほとんどを無視します。
  • select drilldowns[].table で存在しないテーブルを無視します。

    • 今まで、 drilldowns[].table で存在しないテーブルを指定したとき、Groongaはエラーを出力していましたが、今回のリリースから存在しないテーブルを無視します。(エラーを出力しなくなります。)
    • この機能は、一貫性のために実装しています。 output_columns も無効な値を無視します。また、 sort_keys も無効な値のほとんどを無視します。
  • [httpd] バンドルしているnginxのバージョンを1.19.8に更新しました。

修正

  • reference_acquire 参照の自動リリースが発生する前に、テーブルにカラムが追加されテーブルの参照が獲得されたときにGroongaがクラッシュする問題を修正しました。

    • 追加されたカラムの参照は獲得されませんが、自動リリースの対象になるためです。
  • [Windows] 別のスレッドで、他のバックトレースロギングプロセスが動作しているときに、新しくバックトレースロギングプロセスが開始されると、1つ以上のプロセスがSEGVのバックトレースの出力に失敗する問題を修正しました。

既知の問題

  • 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。

さいごに

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

お知らせ 11.0.1リリース

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