BloGroonga

2023-01-06

Groonga 12.1.1リリース

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

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

変更内容

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

改良

  • [select][POWER_SET] ドリルダウンでベクターのべき集合を集計できるようになりました。

    ドリルダウンに 新しいオプション key_vector_expansion を追加しました。 key_vector_expansion は、ドリルダウン対象のキーがベクターのときに、キーの展開方法を指定します。 現状は、key_vector_expansion には NONE または POWER_SET が指定できます。

    key_vector_expansionPOWER_SET を指定することで、べき集合での集計ができるようになります。 この集計方法は、例えばタグの出現回数と、タグの組み合わせの出現回数を一度に集計したい場合に便利です。

    以下では、 GroongaMroongaPGroonga という3つのタグに対して、これらのタグの出現回数と、 これらの組み合わせの出現回数を集計するケースを考えます。

    実行例:

    table_create PowersetDrilldownMemos TABLE_HASH_KEY ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create PowersetDrilldownMemos tags COLUMN_VECTOR ShortText
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    load --table PowersetDrilldownMemos
    [
    {"_key": "Groonga is fast!", "tags": ["Groonga"]},
    {"_key": "Mroonga uses Groonga!", "tags": ["Groonga", "Mroonga"]},
    {"_key": "PGroonga uses Groonga!", "tags": ["Groonga", "PGroonga"]},
    {"_key": "Mroonga and PGroonga are Groonga family", "tags": ["Groonga", "Mroonga", "PGroonga"]}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]
    select PowersetDrilldownMemos \
      --drilldowns[tags].keys tags \
      --drilldowns[tags].key_vector_expansion POWER_SET \
      --drilldowns[tags].columns[power_set].stage initial \
      --drilldowns[tags].columns[power_set].value _key \
      --drilldowns[tags].columns[power_set].flags COLUMN_VECTOR \
      --drilldowns[tags].sort_keys 'power_set' \
      --drilldowns[tags].output_columns 'power_set, _nsubrecs' \
      --limit 0
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         4
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "_key",
    #           "ShortText"
    #         ],
    #         [
    #           "tags",
    #           "ShortText"
    #         ]
    #       ]
    #     ],
    #     {
    #       "tags": [
    #         [
    #           7
    #         ],
    #         [
    #           [
    #             "power_set",
    #             "Text"
    #           ],
    #           [
    #             "_nsubrecs",
    #             "Int32"
    #           ]
    #         ],
    #         [
    #           [
    #             "Groonga"
    #           ],
    #           4
    #         ],
    #         [
    #           [
    #             "Mroonga"
    #           ],
    #           2
    #         ],
    #         [
    #           [
    #             "PGroonga"
    #           ],
    #           2
    #         ],
    #         [
    #           [
    #             "Groonga",
    #             "Mroonga"
    #           ],
    #           2
    #         ],
    #         [
    #           [
    #             "Groonga",
    #             "PGroonga"
    #           ],
    #           2
    #         ],
    #         [
    #           [
    #             "Mroonga",
    #             "PGroonga"
    #           ],
    #           1
    #         ],
    #         [
    #           [
    #             "Groonga",
    #             "Mroonga",
    #             "PGroonga"
    #           ],
    #           1
    #         ]
    #       ]
    #     }
    #   ]
    # ]
    

    この集計結果から、以下のことがわかります。

    タグ 登場回数
    Groonga 4
    Mroonga 2
    PGroonga 2
    Groonga かつ Mroonga 2
    Groonga かつ PGroonga 2
    Mroonga かつ PGroonga 1
    Groonga かつ Mroonga かつ PGroonga 1

    複雑な機能なので、 POWER_SET も合わせて参照してください。

  • [select] ベクターカラムの特定の要素のみを対象に検索できるようになりました。

    match_columns にベクターカラムの特定の要素をインデックス番号で指定することで、ベクターカラムの特定の要素のみを対象に検索できるようになりました。

    以下はこの機能の例です。

    table_create Memos TABLE_NO_KEY
    column_create Memos contents COLUMN_VECTOR ShortText
    
    table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram
    column_create Lexicon memo_index COLUMN_INDEX|WITH_POSITION|WITH_SECTION Memos contents
    load --table Memos
    [
    ["contents"],
    [["I like Groonga", "Use Groonga with Ruby"]],
    [["I like Ruby", "Use Groonga"]]
    ]
    select Memos \
      --match_columns "contents[1]" \
      --query Ruby \
      --output_columns "contents, _score"
    # [
    #   [
    #     0,
    #     0.0,
    #     0.0
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "contents",
    #           "ShortText"
    #         ],
    #         [
    #           "_score",
    #           "Int32"
    #         ]
    #       ],
    #       [
    #         [
    #           "I like Groonga",
    #           "Use Groonga with Ruby"
    #         ],
    #         1
    #       ]
    #     ]
    #   ]
    # ]
    

    --match_columns "contents[1]" とすることで、 contents ベクターの第2要素のみを --query の対象にしています。この例では、 ["I like Groonga", "Use Groonga with Ruby"] は第2要素 Use Groonga with RubyRuby を含むのでヒットしていますが、 ["I like Ruby", "Use Groonga"] は第2要素 Use GroongaRuby を含まないのでヒットしていません。

  • [load] YYYY-MM-DD 形式をサポートしました。

    YYYY-MM-DD は一般的な時間形式です。この形式をサポートしたことで、 load がより使いやすくなりました。

    ロードされた値の時間部分は、現地時間の 00:00:00 になります。

    plugin_register functions/time
    # [[0,0.0,0.0],true]
    table_create Logs TABLE_NO_KEY
    # [[0,0.0,0.0],true]
    column_create Logs created_at COLUMN_SCALAR Time
    # [[0,0.0,0.0],true]
    column_create Logs created_at_text COLUMN_SCALAR ShortText
    # [[0,0.0,0.0],true]
    load --table Logs
    [
    {"created_at": "2000-01-01", "created_at_text": "2000-01-01"}
    ]
    # [[0,0.0,0.0],1]
    select Logs --output_columns "time_format_iso8601(created_at), created_at_text"
    # [
    #   [
    #     0,
    #     0.0,
    #     0.0
    #   ],
    #   [
    #     [
    #       [
    #         1
    #       ],
    #       [
    #         [
    #           "time_format_iso8601",
    #           null
    #         ],
    #         [
    #           "created_at_text",
    #           "ShortText"
    #         ]
    #       ],
    #       [
    #         "2000-01-01T00:00:00.000000+09:00",
    #         "2000-01-01"
    #       ]
    #     ]
    #   ]
    # ]
    

修正

  • [select] command_version3 のとき、 drilldown の結果のラベルが不正になる問題を修正しました。

    以下はこの機能の例です。

    table_create Documents TABLE_NO_KEY
    column_create Documents tag1 COLUMN_SCALAR ShortText
    column_create Documents tag2 COLUMN_SCALAR ShortText
    load --table Documents
    [
    {"tag1": "1", "tag2": "2"}
    ]
    select Documents --drilldown tag1,tag2 --command_version 3
    # {
    #   "header": {
    #     "return_code": 0,
    #     "start_time": 1672123380.653039,
    #     "elapsed_time": 0.0005846023559570312
    #   },
    #   "body": {
    #     "n_hits": 1,
    #     "columns": [
    #       {
    #         "name": "_id",
    #         "type": "UInt32"
    #       },
    #       {
    #         "name": "tag1",
    #         "type": "ShortText"
    #       },
    #       {
    #         "name": "tag2",
    #         "type": "ShortText"
    #       }
    #     ],
    #     "records": [
    #       [
    #         1,
    #         "1",
    #         "2"
    #       ]
    #     ],
    #     "drilldowns": {
    #       "ctor": {
    #         "n_hits": 1,
    #         "columns": [
    #           {
    #             "name": "_key",
    #             "type": "ShortText"
    #           },
    #           {
    #             "name": "_nsubrecs",
    #             "type": "Int32"
    #           }
    #         ],
    #         "records": [
    #           [
    #             "1",
    #             1
    #           ]
    #         ]
    #       },
    #       "tag2": {
    #         "n_hits": 1,
    #         "columns": [
    #           {
    #             "name": "_key",
    #             "type": "ShortText"
    #           },
    #           {
    #             "name": "_nsubrecs",
    #             "type": "Int32"
    #           }
    #         ],
    #         "records": [
    #           [
    #             "2",
    #             1
    #           ]
    #         ]
    #       }
    #     }
    #   }
    # }
    

    select の実行結果の drilldowns 直後の ctor は、本来 tag1 であるべきです。 この例では tag1 ではなく ctor という値になっていますが、どのような値になるかは不定です。

  • [NormalizerTable] 特定の定義が NormalizerTable に存在する場合、Groongaがクラッシュすることがある問題を修正しました。

    以下の例を考えます。

    table_create Normalizations TABLE_PAT_KEY ShortText --normalizer NormalizerNFKC130
    column_create Normalizations normalized COLUMN_SCALAR ShortText
    load --table Normalizations
    [
    {"_key": "Ⅰ", "normalized": "1"},
    {"_key": "Ⅱ", "normalized": "2"},
    {"_key": "Ⅲ", "normalized": "3"}
    ]
    normalize 'NormalizerTable("normalized", "Normalizations.normalized")'   "ⅡⅡ"
    

    この問題は、以下の1.、2.、3.の条件を満たした時に発生します。

    1. 対象となるテーブルのキーがノーマライズされる

      この例では、 Normalizations--normalizer NormalizerNFKC130 が指定されているので、この条件を満たしています。 はそれぞれ NormalizerNFKC130 によって iiiiii にノーマライズされます。

    2. ノーマライズされた文字列に他のノーマライズされた文字列が含まれている

      上記のノーマライズ後の値を考えると、 iiiiii を含んでいるため、条件を満たしています。 iii それぞれノーマライズ前の に対応します。

    3. 2.の文字列を複数使用する

      normaize の対象である ⅡⅡNormalizerNFKC130 によって iiii にノーマライズされます。 この値に対して、 NormalizationsNormalizerNFKC130 によるノーマライズ後の値が一致条件として使用されてノーマライズされます。

      したがって、 iiiiNormalizations でノーマライズしようとするときには、以下の順番でノーマライズされるため、この条件を満たしています。

      • 最初の iii に対応)

        NormalizerTable は最長共通接頭辞探索を行うため、 最初は iii ではなく iii が使用されます。

      • 残りの i に対応)

既知の問題

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

  • *<*> は、filter条件の右辺に query() を使う時のみ有効です。もし、以下のように指定した場合、 *<*>&& として機能します。

    'content @ "Groonga" *< content @ "Mroonga"'

  • GRN_II_CURSOR_SET_MIN_ENABLE が原因でマッチするはずのレコードを返さないことがあります。

さいごに

詳細については、以下のお知らせ、リリース自慢会も参照してください。

お知らせ 12.1.1リリース

リリース自慢会

リリース自慢会は、リリースノートを見ながら、Groongaの新機能・バグ修正を開発者が自慢する会です。

毎月リリースされている最新バージョンについて、開発者的に「これ!」という機能や、「ここをがんばった!」ということを紹介しています。 Liveチャットでコメントも受け付けていますので、気になっていることを質問したり、気になっていたあの機能について聞いたりすることも可能です。

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