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_expansion
にPOWER_SET
を指定することで、べき集合での集計ができるようになります。 この集計方法は、例えばタグの出現回数と、タグの組み合わせの出現回数を一度に集計したい場合に便利です。以下では、
Groonga
、Mroonga
、PGroonga
という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 Ruby
にRuby
を含むのでヒットしていますが、["I like Ruby", "Use Groonga"]
は第2要素Use Groonga
にRuby
を含まないのでヒットしていません。 -
[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_version
が3
のとき、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.の条件を満たした時に発生します。
-
対象となるテーブルのキーがノーマライズされる
この例では、
Normalizations
に--normalizer NormalizerNFKC130
が指定されているので、この条件を満たしています。Ⅰ
、Ⅱ
、Ⅲ
はそれぞれNormalizerNFKC130
によってi
、ii
、iii
にノーマライズされます。 -
ノーマライズされた文字列に他のノーマライズされた文字列が含まれている
上記のノーマライズ後の値を考えると、
iii
がii
とi
を含んでいるため、条件を満たしています。ii
はi
それぞれノーマライズ前のⅡ
とⅠ
に対応します。 -
2.の文字列を複数使用する
normaize
の対象であるⅡⅡ
はNormalizerNFKC130
によってiiii
にノーマライズされます。 この値に対して、Normalizations
のNormalizerNFKC130
によるノーマライズ後の値が一致条件として使用されてノーマライズされます。したがって、
iiii
をNormalizations
でノーマライズしようとするときには、以下の順番でノーマライズされるため、この条件を満たしています。-
最初の
iii
(Ⅲ
に対応)NormalizerTable は最長共通接頭辞探索を行うため、 最初は
ii
やi
ではなくiii
が使用されます。 -
残りの
i
(Ⅰ
に対応)
-
-
既知の問題
-
現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。
-
*<
と*>
は、filter条件の右辺にquery()
を使う時のみ有効です。もし、以下のように指定した場合、*<
と*>
は&&
として機能します。'content @ "Groonga" *< content @ "Mroonga"'
-
GRN_II_CURSOR_SET_MIN_ENABLE
が原因でマッチするはずのレコードを返さないことがあります。
さいごに
詳細については、以下のお知らせ、リリース自慢会も参照してください。
リリース自慢会は、リリースノートを見ながら、Groongaの新機能・バグ修正を開発者が自慢する会です。
毎月リリースされている最新バージョンについて、開発者的に「これ!」という機能や、「ここをがんばった!」ということを紹介しています。 Liveチャットでコメントも受け付けていますので、気になっていることを質問したり、気になっていたあの機能について聞いたりすることも可能です。
それでは、Groongaでガンガン検索してください!