お知らせ - 13系#
13.1.1リリース - 2024-01-09#
改良#
mingw32のサポートをやめました。 [GitHub#1654]
--match_columns
と--query
を使った "vector_column[N] OPERATOR literal" でインデックスを使った検索をサポートしました。
修正#
[Windows]
groonga-normalizer-mysql
をバンドルしました。 [GitHub#1655]Windows版のGroonga 13.1.0に
groonga-normalizer-mysql
が含まれていませんでした。 この問題はGroonga13.1.0でのみ発生します。
13.1.0リリース - 2023-12-26#
改良#
[select] トレースログもキャッシュするようにしました。
Apache Arrow フォーマットの応答で
dict<string>
の出力をサポートしました。[Groonga HTTPサーバー] 新しい content type
application/vnd.apache.arrow.stream
をサポートしました。[query] 以下のような空の入力をサポートしました。
table_create Users TABLE_NO_KEY column_create Users name COLUMN_SCALAR ShortText table_create Lexicon TABLE_HASH_KEY ShortText --default_tokenizer TokenBigramSplitSymbolAlphaDigit --normalizer NormalizerAuto column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name load --table Users [ {"name": "Alice"}, {"name": "Alisa"}, {"name": "Bob"} ] select Users --output_columns name,_score --filter 'query("name", " ")' [ [ 0, 0.0, 0.0 ], [ [ [ 0 ], [ [ "name", "ShortText" ], [ "_score", "Int32" ] ] ] ] ]
BFloat16をサポートしました。(実験的)
BFloat16のloadとselectができるだけです。
bfloat16_value - 1.2
のような算術演算はできません。[column_create] 新しいフラグ
WEIGHT_BFLOAT16
を追加しました。
修正#
[select] Groonga が
output_pretty=yes
の結果をキャッシュした場合、output_pretty
をつけていないクエリーであっても、output_pretty
をつけて返してしまう問題を修正しました。誤ったデータを作り出してしまう問題を修正しました。
通常、ユーザーはこれを明示的に実行できません。数値の動的カラムや一時結果セットが作られたとき、あるいは使われているときに内部的に発生することがあります。
例えば、以下のクエリーで誤ったデータを作り出すことがあります。
select TABLE \ --match_columns TEXT_COLUMN \ --query 'A B OR C' \ --columns[NUMERIC_DYNAMIC_COLUMN].stage result_set \ --columns[NUMERIC_DYNAMIC_COLUMN].type Float32 \ --columns[NUMERIC_DYNAMIC_COLUMN].flags COLUMN_VECTOR
もしこの問題が起こった場合は、
NUMERIC_DYNAMIC_COLUMN
は多くのごみ要素を含んでいます。そして、それは多くのメモリー消費の原因にもなります。この問題はスタック上の未初期化の変数が原因です。そのため、発生するかもしれないし、しないかもしれないことに注意してください。
有効な
normalizers/token_filters
の設定が失敗することがある問題を修正しました。[fuzzy_search] 以下の3つの条件が成立した時にクラッシュする問題を修正しました。
クエリーが2つまたはそれ以上のマルチバイト文字を持っている場合。
${ASCII}${ASCII}${MULTIBYTE}*
という形の文字列がパトリシアトライのテーブルにある場合。WITH_TRANSPOSITION
が有効な場合。
例えば、以下のようにパトリシアトライのテーブル内にある"aaあ"とクエリー"あああ"のペアは問題を起こします。
table_create Users TABLE_NO_KEY column_create Users name COLUMN_SCALAR ShortText table_create Names TABLE_PAT_KEY ShortText column_create Names user COLUMN_INDEX Users name load --table Users [ {"name": "aaあ"}, {"name": "あうi"}, {"name": "あう"}, {"name": "あi"}, {"name": "iう"} ] select Users --filter 'fuzzy_search(name, "あiう", {"with_transposition": true, "max_distance": 3})' --output_columns 'name, _score' --match_escalation_threshold -1
13.0.9リリース - 2023-10-29#
改良#
[select]
--fuzzy_max_expansions
のデフォルト値を0から10に変更しました。--fuzzy_max_expansions
を使うことで検索に使う編集距離の近い語の数を制限できます。この引数を使って、ヒット数と検索パフォーマンスのバランスを取ることができます。--fuzzy_max_expansions
が0の場合は語彙表にある編集距離が--fuzzy_max_distance
以下の語すべてを使って検索をします。ただ、
--fuzzy_max_expansions
が0の場合、検索が遅くなる可能性があります。したがって、今回のリリースから--fuzzy_max_expansions
のデフォルト値を10に変更しました。[select]
select
コマンドの引数に新しく--fuzzy_with_transposition
を追加しました。(実験的)この引数を使うことで「隣接する文字の交換」の編集距離を1または2に指定できます。
--fuzzy_with_transposition
がyes
の場合、文字の交換の編集距離は1
になります。それ以外の値が指定された場合は、文字の交換の編集距離は2
になります。[select]
select
の引数に新しく--fuzzy_tokenize
を追加しました。(実験的)--fuzzy_tokenize
がyes
の時、 Groongaは、誤字を許容する検索で--default_tokenizer
で指定したトークナイザーを使います。--fuzzy_tokenize
のデフォルト値はno
です。--fuzzy_tokenize
が有用なケースは、以下のケースです。検索対象が日本語のデータのみ。
--default_tokenizer
にTokenMecab
を指定する。
[load]
input_type
がapache-arrow
のときも--ifexists
が使えるようになりました。[ノーマライザー]
NormalizerNFKC*
に新しくremove_blank_force
オプションを追加しました。remove_blank_force
がfalse
の時、以下のようにノーマライザーは空白を無視しません。table_create Entries TABLE_NO_KEY column_create Entries body COLUMN_SCALAR ShortText load --table Entries [ {"body": "Groonga はとても速い"}, {"body": "Groongaはとても速い"} ] select Entries --output_columns \ 'highlight(body, \ "gaはとても", "<keyword>", "</keyword>", \ {"normalizers": "NormalizerNFKC150(\\"remove_blank_force\\", false)"} \ )' [ [ 0, 0.0, 0.0 ], [ [ [ 2 ], [ [ "highlight", null ] ], [ "Groonga はとても速い" ], [ "Groon<keyword>gaはとても</keyword>速い" ] ] ] ]
[select]
select
コマンドの引数に新しく--output_trace_log
を追加しました。(実験的)--output_trace_log
にyes
を指定し--command_version 3
を指定した場合、Groongaは以下のようなログを新規に出力します。table_create Memos TABLE_NO_KEY column_create Memos content COLUMN_SCALAR ShortText table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenNgram --normalizer NormalizerNFKC150 column_create Lexicon memos_content COLUMN_INDEX|WITH_POSITION Memos content load --table Memos [ {"content": "This is a pen"}, {"content": "That is a pen"}, {"content": "They are pens"} ] select Memos \ --match_columns content \ --query "Thas OR ere" \ --fuzzy_max_distance 1 \ --output_columns *,_score \ --command_version 3 \ --output_trace_log yes \ --output_type apache-arrow return_code: int32 start_time: timestamp[ns] elapsed_time: double error_message: string error_file: string error_line: uint32 error_function: string error_input_file: string error_input_line: int32 error_input_command: string -- metadata -- GROONGA:data_type: metadata return_code start_time elapsed_time error_message error_file error_line error_function error_input_file error_input_line error_input_command 0 0 1970-01-01T09:00:00+09:00 0.000000 (null) (null) (null) (null) (null) (null) (null) ======================================== depth: uint16 sequence: uint16 name: string value: dense_union<0: uint32=0, 1: string=1> elapsed_time: uint64 -- metadata -- GROONGA:data_type: trace_log depth sequence name value elapsed_time 0 1 0 ii.select.input Thas 0 1 2 0 ii.select.exact.n_hits 0 1 2 2 0 ii.select.fuzzy.input Thas 2 3 2 1 ii.select.fuzzy.input.actual that 3 4 2 2 ii.select.fuzzy.input.actual this 4 5 2 3 ii.select.fuzzy.n_hits 2 5 6 1 1 ii.select.n_hits 2 6 7 1 0 ii.select.input ere 7 8 2 0 ii.select.exact.n_hits 2 8 9 1 1 ii.select.n_hits 2 9 ======================================== content: string _score: double -- metadata -- GROONGA:n_hits: 2 content _score 0 This is a pen 1.000000 1 That is a pen 1.000000
--output_trace_log
は、コマンドバージョン3でのみ有効です。以下のケースで有用です。:
誤字を許容する検索で使われた実際のキーワードの検知。
クエリーログを見ずに実行時間を測定。
[query] オブジェクトリテラルをサポートしました。
[query_expand]
NPP
とONPP
をサポートしました(実験的)。[snippet]
normalizers
オプションをサポートしました。オプション付きのノーマライザーが使えるようになります。例えば、以下のように
snippet()
関数内でスペースを無視したくない時にこのオプションを使います。table_create Entries TABLE_NO_KEY column_create Entries content COLUMN_SCALAR ShortText load --table Entries [ {"content": "Groonga and MySQL"}, {"content": "Groonga and My SQL"} ] select Entries \ --output_columns \ ' snippet(content, "MySQL", "<keyword>", "</keyword>", {"normalizers": "NormalizerNFKC150(\\"remove_blank_force\\", false)"} )' [ [ 0, 0.0, 0.0 ], [ [ [ 2 ], [ [ "snippet", null ] ], [ [ "Groonga and <keyword>MySQL</keyword>" ] ], [ null ] ] ] ]
修正#
Time OPERATOR Float{,32}
が正しく評価されない問題を修正しました。 GH-1624[Reported by yssrku]Float{,32}
内のマイクロ秒(秒未満の小さい値)が使えていませんでした。この問題はTime OPERATOR Float{,32}
の時だけ発生します。以下のように、
load --ifexists 'A OP B || C OP D'
でこの問題は発生します。table_create Reports TABLE_HASH_KEY ShortText column_create Reports content COLUMN_SCALAR Text column_create Reports modified_at COLUMN_SCALAR Time load --table Reports [ {"_key": "a", "content": "", "modified_at": 1663989875.438} ] load \ --table Reports \ --ifexists 'content == "" && modified_at <= 1663989875.437'
しかし、
select --filter
では発生しません。alnum(a-zA-Z0-9) + blank
が検知されることがある問題を修正しました。ab
やa b
のように複数の空白を含むテキストがマッチする場合、a b
が検知されますが、このケースでは検知すべきではありません。例えば、この問題が発生すると、以下のように
a i
を検知してしまいます。table_create Entries TABLE_NO_KEY column_create Entries body COLUMN_SCALAR ShortText load --table Entries [ {"body": "Groonga is fast"} ] select Entries \ --output_columns 'highlight(body, "ai", "<keyword>", "</keyword>")' [ [ 0,0.0,0.0 ], [ [ [ 1 ], [ [ "highlight", null ] ], [ "Groong<keyword>a i</keyword>s fast" ] ] ] ]
しかし、上記の結果は期待していない結果です。上記ケースでは
a i
は検知してほしくありません。
感謝#
yssrku
13.0.8リリース - 2023-09-29#
改良#
[column_create]
column_create
に新しいフラグCOLUMN_FILTER_SHUFFLE
,COLUMN_FILTER_BYTE_DELTA
,COMPRESS_FILTER_TRUNCATE_PRECISION_1BYTE
, andCOMPRESS_FILTER_TRUNCATE_PRECISION_2BYTES
を追加しました。新しくBloscをバンドルしました。
COLUMN_FILTER_SHUFFLE
,COLUMN_FILTER_BYTE_DELTA
,COMPRESS_FILTER_TRUNCATE_PRECISION_1BYTE
,COMPRESS_FILTER_TRUNCATE_PRECISION_2BYTES
フラグがBloscを要求します。[status]
status
コマンドの出力に新しく"blosc"
を追加しました。[groonga 実行ファイル]
groonga --version
の出力に新しくblosc
を追加しました。[select]
select
の引数に新しく--fuzzy_max_distance
を追加しました。(実験的)[select]
select
コマンドの引数に新しく--fuzzy_max_expansions
を追加しました。(実験的)[select]
select
コマンドの引数に新しく--fuzzy_max_distance_ratio
を追加しました。(実験的)[select]
select
コマンドの引数に新しく--fuzzy_prefix_length
を追加しました。(実験的)[cast]
"[0.0, 1.0, 1.1, ...]"
をFloat
/Float32
のベクターへキャストできるようにしました。[fuzzy_search]
max_expansion
オプションの名前をmax_expansions
に変更しました。max_expansion
option はこのリリースから非推奨になりますが、後方互換性を維持するために引き続き使えるようにしています。master ブランチの名前を main に変更しました。
[RPM] CMakeを使ってビルドするようにしました。
[Debian] Debian trixie をサポートしました。
修正#
[fuzzy_search] ヒットしないはずのレコードがヒットすることがある問題を修正しました。
[近傍フレーズ検索条件][近傍フレーズ検索演算子] 以下のように、最初のフレーズグループに何もマッチしない時にGroongaがクラッシュする問題を修正しました。
table_create Entries TABLE_NO_KEY column_create Entries content COLUMN_SCALAR Text table_create Terms TABLE_PAT_KEY ShortText \ --default_tokenizer TokenNgram \ --normalizer NormalizerNFKC121 column_create Terms entries_content COLUMN_INDEX|WITH_POSITION \ Entries content load --table Entries [ {"content": "x y z"} ] select Entries \ --match_columns Terms.entries_content.content \ --query '*NPP1"(NONEXISTENT) (z)"' \ --output_columns '_score, content'
13.0.7リリース - 2023-09-12#
修正#
[normalize]
normalize
コマンドで最後のoffset
とtype
が表示されない問題を修正しました。normalize
コマンドは以下のようにノーマライズ後の文字のオフセットとタイプを表示できますが、最後のoffset
とtype
が表示されていませんでした。table_create Normalizations TABLE_PAT_KEY ShortText column_create Normalizations normalized COLUMN_SCALAR ShortText load --table Normalizations [ {"_key": "あ", "normalized": "<あ>"} ] normalize 'NormalizerNFKC130("unify_kana", true, "report_source_offset", true), NormalizerTable("normalized", "Normalizations.normalized", "report_source_offset", true)' "お あ a ア i ア オ" REMOVE_BLANK|WITH_TYPES|WITH_CHECKS [ [ 0, 0.0, 0.0 ], { "normalized": "お<あ>a<あ>i<あ>お", "types": [ "hiragana", "symbol", "hiragana", "symbol", "alpha", "symbol", "hiragana", "symbol", "alpha", "symbol", "hiragana", "symbol", "hiragana" ], "checks": [ 3, 0, 0, 4, -1, 0, 0, -1, 4, 4, -1, 0, 0, -1, 4, 4, -1, 0, 0, -1, 4, 0, 0 ], "offsets": [ 0, 4, 4, 4, 8, 12, 12, 12, 16, 20, 20, 20, 24 ] } ]
[ノーマライザー] 複数のノーマライザーを使用した時に最後の文字のオフセットが不正になることがある問題を修正しました。
例えば以下の例では、最後のオフセットは27が正しいですが、以下の例ではこの問題が原因で17になっています。
table_create Normalizations TABLE_PAT_KEY ShortText column_create Normalizations normalized COLUMN_SCALAR ShortText load --table Normalizations [ {"_key": "あ", "normalized": "<あ>"} ] normalize 'NormalizerNFKC130("unify_kana", true, "report_source_offset", true), NormalizerTable("normalized", "Normalizations.normalized", "report_source_offset", true)' "お あ a ア i ア オ" REMOVE_BLANK|WITH_TYPES|WITH_CHECKS [ [ 0, 0.0, 0.0 ], { "normalized": "お<あ>a<あ>i<あ>お", "types": [ "hiragana", "symbol", "hiragana", "symbol", "alpha", "symbol", "hiragana", "symbol", "alpha", "symbol", "hiragana", "symbol", "hiragana", "null" ], "checks": [ 3, 0, 0, 4, -1, 0, 0, -1, 4, 4, -1, 0, 0, -1, 4, 4, -1, 0, 0, -1, 4, 0, 0 ], "offsets": [ 0, 4, 4, 4, 8, 12, 12, 12, 16, 20, 20, 20, 24, 17 ] } ]
13.0.6リリース - 2023-08-31#
改良#
[highlight_html] 以下のように
highlight_html()
に空文字列を指定してもエラーを報告しなくなりました。highlight_html()
は空のテキストを返します。table_create Entries TABLE_NO_KEY column_create Entries body COLUMN_SCALAR ShortText table_create Terms TABLE_PAT_KEY ShortText \ --default_tokenizer 'TokenNgram("report_source_location", true)' \ --normalizer 'NormalizerNFKC150' column_create Terms document_index COLUMN_INDEX|WITH_POSITION Entries body load --table Entries [ {"body": "ab cd ed gh"} ] select Entries \ --match_columns body \ --query 'ab' \ --output_columns 'highlight_html("", Terms)' [ [ 0, 0.0, 0.0 ], [ [ [ 1 ], [ [ "highlight_html",null ] ], [ "" ] ] ] ]
動的カラムや疑似カラムを対象に
aggregator_*
を使えるようになりました。疑似カラムとは、
_
で始まるカラムのことです。(例:_id
,_nsubrecs
, ...)
修正#
[CMake] msgpack と msgpackc-cxx の両方がインストールされている環境でCMakeによるビルドが失敗する問題を修正しました。
詳細については、 groonga/groonga#1601 のコメントを参照してください。
x OR <0.0y
とQUERY_NO_SYNTAX_ERROR
を使った時に式を正しくパースできない問題を修正しました。マッチするはずのレコードがマッチしなくなることがあります。
例えば、以下のようなクエリーを実行した場合、
{"_key": "name yyy"}
はマッチするはずですが、マッチしません。table_create Names TABLE_PAT_KEY ShortText table_create Tokens TABLE_PAT_KEY ShortText \ --default_tokenizer TokenBigram \ --normalizer NormalizerAuto column_create Tokens names_key COLUMN_INDEX|WITH_POSITION Names _key load --table Names [ {"_key": "name yyy"} ] select Names \ --match_columns "_key" \ --query "xxx OR <0.0yyy" \ --query_flags ALLOW_PRAGMA|ALLOW_COLUMN|QUERY_NO_SYNTAX_ERROR [ [ 0, 0.0, 0.0 ], [ [ [ 0 ], [ [ "_id", "UInt32" ], [ "_key", "ShortText" ] ] ] ] ]
[highlight_html] ハイライト位置が正しくないことがある問題を修正しました。
例えば、ハイライト対象に文字数が1のキーワードと文字数が2のキーワードを両方指定した時に発生します。
13.0.5リリース - 2023-08-02#
修正#
インデックス構築に失敗することがある問題を修正しました。
この問題は、Groonga v13.0.2, v13.0.3, v13.0.4 に存在します。したがって、これらのバージョンを使用している場合は、 Groonga v13.0.5 以降を使用することを強くおすすめします。
[近傍フレーズ検索条件][近傍フレーズ検索演算子] 各近傍フレーズ検索で、無効なシンタックスのクエリーを指定した時にGroongaがクラッシュすることがある問題を修正しました。
例えば、以下のケースでは本来エラーになるべきですが、この問題があるとクラッシュします。("--query"の値に閉じカッコが一つ多い点に着目してください。)
table_create Entries TABLE_NO_KEY [[0,0.0,0.0],true] column_create Entries content COLUMN_SCALAR Text [[0,0.0,0.0],true] table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenNgram --normalizer NormalizerNFKC121 [[0,0.0,0.0],true] column_create Terms entries_content COLUMN_INDEX|WITH_POSITION Entries content [[0,0.0,0.0],true] load --table Entries [ {"content": "a b c"} ] [[0,0.0,0.0],1] select Entries --match_columns content --query '*NPP2"(a b))"' --output_columns '_score, content'
13.0.4リリース - 2023-07-26#
改良#
[Windows] 32-bit版パッケージの提供をやめました。
修正#
[Debian GNU/Linux] [Ubuntu] QueryExpanderTSVのデフォルトの設定ファイルのパスを修正しました。
[CMake] CMake 3.16または3.17を使っている場合にエラーになることがある問題を修正しました。
13.0.3リリース - 2023-07-24#
改良#
[groonga-httpd] groonga-nginxに切り出されました。
groonga-httpd
パッケージの提供をやめました。Debian GNU/Linux 12以降あるいはUbuntu 23.10以降のユーザーはデフォルトの
nginx
パッケージと一緒に使えるlibnginx-mod-http-groonga
パッケージを使ってください。詳細はgroonga-nginxのREADMEを参照してください。古いDebian/UbuntuまたはRHEL関連ディストリビューションのユーザーは
groonga-httpd
相当のパッケージを使うことはできません。代わりにGroonga HTTPサーバーを使うことができます。もし、Groonga HTTPサーバーがあなたのユースケースでは適切ではない場合、あなたのユースケース付きでDiscussionsに報告してください。[Ubuntu] Ubuntu 23.10(Mantic Minotaur)をサポートしました。
[Debian GNU/Linux] xxHashサポートを有効にしました。
[Ubuntu] xxHashサポートを有効にしました。
修正#
ソースアーカイブがCMakeでビルドできない問題を修正しました。
13.0.2リリース - 2023-07-12#
改良#
[Ubuntu] Ubuntu 18.04(Bionic Beaver)のサポートをやめました。
[Ubuntu] Ubuntu 23.04(Lunar Lobster)をサポートしました。
[Debian GNU/Linux] Debian 12 (bookworm) をサポートしました。
[Oracle Linux] Oracle Linuxサポートをやめました。代わりに AlmaLinux 用パッケージを使ってください。
[
grn_highlighter
] タグの変更をサポートしました。GH-1453 [askdkcさんが報告]
[
grn_highlighter
] ノーマライザーの変更をサポートしました。[
grn_highlighter
] HTMLモードの変更をサポートしました。[
grn_highlighter
] 複数タグをサポートしました。[highlight]
sequential_class_tag_mode
オプションを追加しました。[highlight_html]
sequential_class_tag_mode
オプションを追加しました。[reference_acquire]
--recursive dependent
が使われたときに対象オブジェクト用のインデックスカラムも参照するように変更しました。対象オブジェクトがカラムの場合、そのカラム用のインデックスカラムも参照されます。
対象オブジェクトがテーブルの場合、そのテーブル用のインデックスカラムも参照されます。
対象オブジェクトがDBの場合、すべてのテーブルが対象オブジェクトになります。
[CMake] CMake 3.16以降を必須としました。近い将来、GNU AutotoolsではなくCMakeを推奨ビルドツールとし、いずれGNU Autotoolsサポートをやめる予定です。
[CMake] CMakeパッケージに対応しました。
find_package(Groonga)
というように使えます。[Packaging] ソースアーカイブ中の
configure
を生成しているGNU Autotoolsを更新しました。[
ranguba/rroonga#220 <https://github.com/ranguba/rroonga/issues/220>
_] [ZangRuochenさんが報告][reference_acquire] 組み込みオブジェクト用のリファレンスカウント実装を最適化しました。
SIGABRT
発生時もバックトレースのログ出力するようにしました。
修正#
[順序付き近傍フレーズ直積検索条件] [順序付き近傍フレーズ直積検索演算子] マッチするべきレコードがマッチしないことがある問題を修正しました。
この問題は、クエリー内に3つ以上トークンがあり、かつ、それらがオーバーラップしているときに発生します。たとえば、
abc
とabcd
はうまく動かない組み合わせです。もし、短い方(abc
)が長い方(abcd
)より前にある場合はこの問題は発生しません。たとえば、ONPP1 "(abcd abc) (1 2)"
は動きますが、ONPP1 "(abc abcd) (1 2)"
は動きません。複数の重み調整演算子を使った場合、不正な重みが使われることがある問題を修正しました。
[クエリー構文] 誤字を修正しました。
[
GH-1560 <https://github.com/groonga/groonga/issues/1560>
_] [Dylan Golowさんがパッチ提供][近傍フレーズ検索条件] [近傍フレーズ検索演算子] [近傍フレーズ直積検索条件] [近傍フレーズ直積検索演算子] [順序付き近傍フレーズ検索条件] [順序付き近傍フレーズ検索演算子] [順序付き近傍フレーズ直積検索条件] [順序付き近傍フレーズ直積検索演算子]
additional_last_interval
を使っている場合、距離の計算が間違っている問題を修正しました。たとえば、
aaaxxxbbbcdefghi.
に対して*NP3,-1"aaa bbb .$"
で検索するケースを考えます。このケースではaaa
とbbb
の間のトークン数は3であるべきですが7になっていました。[近傍フレーズ直積検索条件] [近傍フレーズ直積検索演算子] [順序付き近傍フレーズ直積検索条件] [順序付き近傍フレーズ直積検索演算子] 同じフレーズグループ内に同じフレーズが存在するときに無限ループする問題を修正しました。
たとえば、
*NPP1 "(abcd abc abcd bcde) (efghi)"
は問題が発生するクエリーです。なぜなら最初のフレーズグループ内に2つabcd
が存在するからです。たとえば、
*NPP1 "(abcde \"abc de\") (efghi)"
は問題が発生するクエリーです。なぜなら最初のフレーズグループ内にabcde
と"abc de"
が存在するからです。これらは「論理的に」同じフレーズです。ロック獲得に失敗した場合に内部のロックカウントを減らしていない問題を修正しました。通常はこれが問題になることはありません。
感謝#
askdkcさん
Dylan Golowさん
ZangRuochenさん
13.0.1リリース - 2023-03-24#
改良#
[highlight_html] 前方一致検索をサポートしました。
highlight_html
で前方一致検索ができるようになりました。ただし、ハイライトするキーワードは、最初の出現箇所だけでなく、途中および最後の出現箇所もハイライトされます。
table_create Tags TABLE_NO_KEY column_create Tags name COLUMN_SCALAR ShortText table_create Terms TABLE_PAT_KEY ShortText \ --normalizer 'NormalizerNFKC150' column_create Terms tags_name COLUMN_INDEX Tags name load --table Tags [ {"name": "Groonga"} ] select Tags \ --query "name:^g" \ --output_columns "highlight_html(name)" # [ # [ # 0, # 0.0, # 0.0 # ], # [ # [ # [ # 1 # ], # [ # [ # "highlight_html", # null # ] # ], # [ # "<span class=\"keyword\">G</span>roon<span class=\"keyword\">g</span>a" # ] # ] # ] # ]
[ノーマライザー]
NormalizerNFKC\*
に新しいオプションを追加しました。unify_kana_prolonged_sound_mark
このオプションによって、長音記号を以下のように正規化できます。
ァー -> ァア, アー -> アア, ヵー -> ヵア, カー -> カア, ガー -> ガア, サー -> サア, ザー -> ザア, ター -> タア, ダー -> ダア, ナー -> ナア, ハー -> ハア, バー -> バア, パー -> パア, マー -> マア, ャー -> ャア, ヤー -> ヤア, ラー -> ラア, ヮー -> ヮア, ワー -> ワア, ヷー -> ヷア, ィー -> ィイ, イー -> イイ, キー -> キイ, ギー -> ギイ, シー -> シイ, ジー -> ジイ, チー -> チイ, ヂー -> ヂイ, ニー -> ニイ, ヒー -> ヒイ, ビー -> ビイ, ピー -> ピイ, ミー -> ミイ, リー -> リイ, ヰー -> ヰイ, ヸー -> ヸイ, ゥー -> ゥウ, ウー -> ウウ, クー -> クウ, グー -> グウ, スー -> スウ, ズー -> ズウ, ツー -> ツウ, ヅー -> ヅウ, ヌー -> ヌウ, フー -> フウ, ブー -> ブウ, プー -> プウ, ムー -> ムウ, ュー -> ュウ, ユー -> ユウ, ルー -> ルウ, ヱー -> ヱウ, ヴー -> ヴウ, ェー -> ェエ, エー -> エエ, ヶー -> ヶエ, ケー -> ケエ, ゲー -> ゲエ, セー -> セエ, ゼー -> ゼエ, テー -> テエ, デー -> デエ, ネー -> ネエ, ヘー -> ヘエ, ベー -> ベエ, ペー -> ペエ, メー -> メエ, レー -> レエ, ヹー -> ヹエ, ォー -> ォオ, オー -> オオ, コー -> コオ, ゴー -> ゴオ, ソー -> ソオ, ゾー -> ゾオ, トー -> トオ, ドー -> ドオ, ノー -> ノオ, ホー -> ホオ, ボー -> ボオ, ポー -> ポオ, モー -> モオ, ョー -> ョオ, ヨー -> ヨオ, ロー -> ロオ, ヲー -> ヲオ, ヺー -> ヺオ, ンー -> ンン ぁー -> ぁあ, あー -> ああ, ゕー -> ゕあ, かー -> かあ, がー -> があ, さー -> さあ, ざー -> ざあ, たー -> たあ, だー -> だあ, なー -> なあ, はー -> はあ, ばー -> ばあ, ぱー -> ぱあ, まー -> まあ, ゃー -> ゃあ, やー -> やあ, らー -> らあ, ゎー -> ゎあ, わー -> わあ ぃー -> ぃい, いー -> いい, きー -> きい, ぎー -> ぎい, しー -> しい, じー -> じい, ちー -> ちい, ぢー -> ぢい, にー -> にい, ひー -> ひい, びー -> びい, ぴー -> ぴい, みー -> みい, りー -> りい, ゐー -> ゐい ぅー -> ぅう, うー -> うう, くー -> くう, ぐー -> ぐう, すー -> すう, ずー -> ずう, つー -> つう, づー -> づう, ぬー -> ぬう, ふー -> ふう, ぶー -> ぶう, ぷー -> ぷう, むー -> むう, ゅー -> ゅう, ゆー -> ゆう, るー -> るう, ゑー -> ゑう, ゔー -> ゔう ぇー -> ぇえ, えー -> ええ, ゖー -> ゖえ, けー -> けえ, げー -> げえ, せー -> せえ, ぜー -> ぜえ, てー -> てえ, でー -> でえ, ねー -> ねえ, へー -> へえ, べー -> べえ, ぺー -> ぺえ, めー -> めえ, れー -> れえ ぉー -> ぉお, おー -> おお, こー -> こお, ごー -> ごお, そー -> そお, ぞー -> ぞお, とー -> とお, どー -> どお, のー -> のお, ほー -> ほお, ぼー -> ぼお, ぽー -> ぽお, もー -> もお, ょー -> ょお, よー -> よお, ろー -> ろお, をー -> をお んー -> んん
以下は、
unify_kana_prolonged_sound_mark
オプションの使用例です。table_create --name Animals --flags TABLE_HASH_KEY --key_type ShortText column_create --table Animals --name name --type ShortText column_create --table Animals --name sound --type ShortText load --table Animals [ {"_key":"1","name":"羊", "sound":"メーメー"}, ] table_create \ --name idx_animals_sound \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_kana_prolonged_sound_mark", true)' column_create --table idx_animals_sound --name animals_sound --flags COLUMN_INDEX|WITH_POSITION --type Animals --source sound select --table Animals --query sound:@メエメエ # [ # [ # 0, # 1677829950.652696, # 0.01971983909606934 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ], # [ # "sound", # "ShortText" # ] # ], # [ # 1, # "1", # "羊", # "メーメー" # ] # ] # ] # ]
unify_kana_hyphen
このオプションを使うことで、ハイフンを以下のように正規化できます。
ァ- -> ァア, ア- -> アア, ヵ- -> ヵア, カ- -> カア, ガ- -> ガア, サ- -> サア, ザ- -> ザア, タ- -> タア, ダ- -> ダア, ナ- -> ナア, ハ- -> ハア, バ- -> バア, パ- -> パア, マ- -> マア, ャ- -> ャア, ヤ- -> ヤア, ラ- -> ラア, ヮ- -> ヮア, ワ- -> ワア, ヷ- -> ヷア, ィ- -> ィイ, イ- -> イイ, キ- -> キイ, ギ- -> ギイ, シ- -> シイ, ジ- -> ジイ, チ- -> チイ, ヂ- -> ヂイ, ニ- -> ニイ, ヒ- -> ヒイ, ビ- -> ビイ, ピ- -> ピイ, ミ- -> ミイ, リ- -> リイ, ヰ- -> ヰイ, ヸ- -> ヸイ, ゥ- -> ゥウ, ウ- -> ウウ, ク- -> クウ, グ- -> グウ, ス- -> スウ, ズ- -> ズウ, ツ- -> ツウ, ヅ- -> ヅウ, ヌ- -> ヌウ, フ- -> フウ, ブ- -> ブウ, プ- -> プウ, ム- -> ムウ, ュ- -> ュウ, ユ- -> ユウ, ル- -> ルウ, ヱ- -> ヱウ, ヴ- -> ヴウ, ェ- -> ェエ, エ- -> エエ, ヶ- -> ヶエ, ケ- -> ケエ, ゲ- -> ゲエ, セ- -> セエ, ゼ- -> ゼエ, テ- -> テエ, デ- -> デエ, ネ- -> ネエ, ヘ- -> ヘエ, ベ- -> ベエ, ペ- -> ペエ, メ- -> メエ, レ- -> レエ, ヹ- -> ヹエ, ォ- -> ォオ, オ- -> オオ, コ- -> コオ, ゴ- -> ゴオ, ソ- -> ソオ, ゾ- -> ゾオ, ト- -> トオ, ド- -> ドオ, ノ- -> ノオ, ホ- -> ホオ, ボ- -> ボオ, ポ- -> ポオ, モ- -> モオ, ョ- -> ョオ, ヨ- -> ヨオ, ロ- -> ロオ, ヲ- -> ヲオ, ヺ- -> ヺオ, ン- -> ンン ぁ- -> ぁあ, あ- -> ああ, ゕ- -> ゕあ, か- -> かあ, が- -> があ, さ- -> さあ, ざ- -> ざあ, た- -> たあ, だ- -> だあ, な- -> なあ, は- -> はあ, ば- -> ばあ, ぱ- -> ぱあ, ま- -> まあ, ゃ- -> ゃあ, や- -> やあ, ら- -> らあ, ゎ- -> ゎあ, わ- -> わあ ぃ- -> ぃい, い- -> いい, き- -> きい, ぎ- -> ぎい, し- -> しい, じ- -> じい, ち- -> ちい, ぢ- -> ぢい, に- -> にい, ひ- -> ひい, び- -> びい, ぴ- -> ぴい, み- -> みい, り- -> りい, ゐ- -> ゐい ぅ- -> ぅう, う- -> うう, く- -> くう, ぐ- -> ぐう, す- -> すう, ず- -> ずう, つ- -> つう, づ- -> づう, ぬ- -> ぬう, ふ- -> ふう, ぶ- -> ぶう, ぷ- -> ぷう, む- -> むう, ゅ- -> ゅう, ゆ- -> ゆう, る- -> るう, ゑ- -> ゑう, ゔ- -> ゔう ぇ- -> ぇえ, え- -> ええ, ゖ- -> ゖえ, け- -> けえ, げ- -> げえ, せ- -> せえ, ぜ- -> ぜえ, て- -> てえ, で- -> でえ, ね- -> ねえ, へ- -> へえ, べ- -> べえ, ぺ- -> ぺえ, め- -> めえ, れ- -> れえ ぉ- -> ぉお, お- -> おお, こ- -> こお, ご- -> ごお, そ- -> そお, ぞ- -> ぞお, と- -> とお, ど- -> どお, の- -> のお, ほ- -> ほお, ぼ- -> ぼお, ぽ- -> ぽお, も- -> もお, ょ- -> ょお, よ- -> よお, ろ- -> ろお, を- -> をお ん- -> んん
以下は、
unify_kana_hyphen
オプションの使用例です。table_create --name Animals --flags TABLE_HASH_KEY --key_type ShortText column_create --table Animals --name name --type ShortText column_create --table Animals --name sound --type ShortText load --table Animals [ {"_key":"1","name":"羊", "sound":"メ-メ-"}, ] table_create \ --name idx_animals_sound \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_kana_hyphen", true)' column_create --table idx_animals_sound --name animals_sound --flags COLUMN_INDEX|WITH_POSITION --type Animals --source sound select --table Animals --query sound:@メエメエ # [ # [ # 0,1677829950.652696, # 0.01971983909606934 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ], # [ # "sound", # "ShortText" # ] # ], # [ # 1, # "1", # "羊", # "メ-メ-" # ] # ] # ] # ]
[近傍検索条件][近傍検索演算子] 各近傍検索に
${MIN_INTERVAL}
オプションを追加しました。${MIN_INTERVAL}
でフレーズ間(単語間)の最低距離を指定できるようになりました。フレーズ間(単語間)の距離は、最低でもこの値以上である必要があります。新しい構文は以下のとおりです。
*N${MAX_INTERVAL},${MAX_TOKEN_INTERVAL_1}|${MAX_TOKEN_INTERVAL_2}|...,${MIN_INTERVAL} "word1 word2 ..." *NP${MAX_INTERVAL},${ADDITIONAL_LAST_INTERVAL},${MAX_PHRASE_INTERVAL_1}|${MAX_PHRASE_INTERVAL_2}|...,${MIN_INTERVAL} "phrase1 phrase2 ..." *NPP${MAX_INTERVAL},${ADDITIONAL_LAST_INTERVAL},${MAX_PHRASE_INTERVAL_1}|${MAX_PHRASE_INTERVAL_2}|...,${MIN_INTERVAL} "(phrase1-1 phrase1-2 ...) (phrase2-1 phrase2-2 ...) ..." *ONP${MAX_INTERVAL},${ADDITIONAL_LAST_INTERVAL},${MAX_PHRASE_INTERVAL_1}|${MAX_PHRASE_INTERVAL_2}|...,${MIN_INTERVAL} "phrase1 phrase2 ..." *ONPP${MAX_INTERVAL},${ADDITIONAL_LAST_INTERVAL},${MAX_PHRASE_INTERVAL_1}|${MAX_PHRASE_INTERVAL_2}|...,${MIN_INTERVAL} "(phrase1-1 phrase1-2 ...) (phrase2-1 phrase2-2 ...) ..."
${MIN_INTERVAL}
のデフォルト値はINT32_MIN
(-2147483648
) です。${MIN_INTERVAL}
を省略した場合デフォルト値が使用されます。このオプションは重複したフレーズを無視するのに便利です。
*NP
の距離は各フレーズの先頭のトークンの距離 - 左のフレーズのトークン数 + 1
で計算されます。トークナイザーがバイグラムの場合を考えると、例えば、
東京
は東京
という一つのトークンを持ち、京都
は京都
という一つのトークンを持ちます。*NP "東京 京都"
の対象の値として東京都
を考えてみます。各フレーズの先頭のトークンの距離
:1
(東京
と京都
の距離)左のフレーズのトークン数
:1
(東京
)
東京都
に対して*NP
で使われる距離は、1 - 1 + 1
=1
となります。結果として、
東京
と京都
が重複していないとき、*NP
で使われる距離は1
より大きくなります。このオプションは重複したフレーズを無視するのに便利です。
table_create Entries TABLE_NO_KEY column_create Entries content COLUMN_SCALAR Text table_create Terms TABLE_PAT_KEY ShortText \ --default_tokenizer 'TokenNgram("unify_alphabet", false, \ "unify_digit", false)' \ --normalizer NormalizerNFKC150 column_create Terms entries_content COLUMN_INDEX|WITH_POSITION Entries content load --table Entries [ {"content": "東京都"}, {"content": "東京京都"} ] select Entries \ --match_columns content \ --query '*NP-1,0,,2"東京 京都"' \ --output_columns '_score, content' # [ # [ # 0, # 0.0, # 0.0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_score", # "Int32" # ], # [ # "content", # "Text" # ] # ], # [ # 1, # "東京京都" # ] # ] # ] # ]
上記の例では、
東京都
は距離が1
なのでマッチしませんが、東京京都
は距離が2
なのでマッチします。[ノーマライザー]
unify_katakana_trailing_o
オプションで新しい値をサポートしました。unify_katakana_trailing_o
で以下の新しい値のノーマライズをサポートしました。これらの左側の文字の母音がオ
なので、ノーマライズすべきなためです。ォオ
->ォウ
ョオ
->ョウ
ヺオ
->ヺウ
MessagePack v6.0.0 をサポートしました。 [GitHub#1536][Reported by Carlo Cabrera]
今まで、Groongaは
configure
またはcmake
実行時にMessagePack v6.0.0以降のMessagePackを検出できませんでした。このリリースから、MessagePackがv6.0.0以降であっても検出できるようになります。
修正#
[ノーマライザー] NormalizerNFKC*が不正な正規化をする問題を修正しました。
この問題は、
unify_kana_case
とunify_katakana_v_sounds
を同時に使う場合に発生します。例えば、
unify_kana_case
とunify_katakana_v_sounds
を同時に使うとき、ヴァ
がバア
にノーマライズされていました。しかしヴァ
はバ
と正規化されるべきです。これは、
unify_kana_case
でヴァ
がヴア
と正規化され、その後、unify_katakana_v_sounds
によってヴア
がバア
と正規化されていたことが原因です。unify_katakana_v_sounds
がunify_kana_case
より前に適用されるように修正しました。以下は以前のバージョンでの問題の発生例です。
normalize \ 'NormalizerNFKC150("unify_katakana_v_sounds", true, \ "unify_kana_case", true)' \ "ヴァーチャル" #[ # [ # 0, # 1678097412.913053, # 0.00019073486328125 # ], # { # "normalized":"ブアーチヤル", # "types":[], # "checks":[] # } #]
このバージョンから、
ヴァーチャル
はバーチヤル
にノーマライズされます。[順序付き近傍フレーズ検索条件][順序付き近傍フレーズ検索演算子]
${MAX_PHRASE_INTERVALS}
が正しく動かない問題を修正しました。この問題が発生したとき、距離は
0
とみなされます。したがって、この問題が発生した場合、余分にレコードがヒットすることがあります。この問題は以下の場合に発生します。
*ONP
で${MAX_PHRASE_INTERVALS}
を使用しているマッチした左側のフレーズに含まれるトークンの数が、
${MAX_PHRASE_INTERVALS}
で指定した要素数より多い
以下はこの問題の例です。
table_create Entries TABLE_NO_KEY column_create Entries content COLUMN_SCALAR Text table_create Terms TABLE_PAT_KEY ShortText \ --default_tokenizer 'TokenNgram("unify_alphabet", false, \ "unify_digit", false)' \ --normalizer NormalizerNFKC150 column_create Terms entries_content COLUMN_INDEX|WITH_POSITION Entries content load --table Entries [ {"content": "abcXYZdef"}, {"content": "abcdef"}, {"content": "abc123456789def"}, {"content": "abc12345678def"}, {"content": "abc1de2def"} ] select Entries --filter 'content *ONP-1,0,1 "abc def"' --output_columns '_score, content' #[ # [ # 0, # 0.0, # 0.0 # ], # [ # [ # [ # 5 # ], # [ # [ # "_score", # "Int32" # ], # [ # "content", # "Text" # ] # ], # [ # 1, # "abcXYZdef" # ], # [ # 1, # "abcdef" # ], # [ # 1, # "abc123456789def" # ], # [ # 1, # "abc12345678def" # ], # [ # 1, # "abc1de2def" # ] # ] # ] #]
上記の例では、
*ONP-1,0,1 "abc def"
で、最初の要素の距離に1
を指定しています。しかし、距離が1
より離れているものも含めた、すべてのcontent
がマッチしています。これは、この例がこの問題の発生条件を満たしていて、距離が
0
とみなされているためです。*ONP
で${MAX_PHRASE_INTERVALS}
を使用している*ONP-1,0,1 "abc def"
は${MAX_PHRASE_INTERVALS}
を使用している。マッチした左側のフレーズに含まれるトークンの数が、
${MAX_PHRASE_INTERVALS}
で指定した要素数より多いマッチした左側のフレーズ:
abc
含まれるトークン:
ab
、bc
TokenNgram("unify_alphabet", false, "unify_digit", false)
によるトークナイズ
左側のフレーズに含まれるトークン数 (
2
) >max_element_intervals
にに含まれる要素数 (1
)*ONP-1,0,1 "abc def"
の1
左側のフレーズに含まれるトークン数 (
2
) >max_element_intervals
にに含まれる要素数 (1
)
[近傍フレーズ検索条件][近傍フレーズ検索演算子] 各近傍フレーズ検索で、最後として指定したフレーズが最後として使用されない問題を修正しました。
この問題が発生すると
${ADDITIONAL_LAST_INTERVAL}
は無視され、${MAX_INTERVAL}
が使用されます。この問題は以下の場合に発生します。
最後として指定されたフレーズが複数のトークンを含む
そのフレーズの最後のトークンのサイズが、他のトークンのサイズ以下である
トークンサイズとは、全レコード中に出現するそのトークンの数です。
以下はこの問題の例です。
table_create Entries TABLE_NO_KEY column_create Entries content COLUMN_SCALAR Text table_create Terms TABLE_PAT_KEY ShortText \ --default_tokenizer 'TokenNgram("unify_alphabet", false, \ "unify_digit", false)' \ --normalizer NormalizerNFKC150 column_create Terms entries_content COLUMN_INDEX|WITH_POSITION Entries content load --table Entries [ {"content": "abc123456789defg"}, {"content": "dededede"} ] select Entries \ --filter 'content *NP10,1"abc defg$"' \ --output_columns '_score, content' #[ # [ # 0, # 0.0, # 0.0 # ], # [ # [ # [ # 0 # ], # [ # [ # "_score", # "Int32" # ], # [ # "content", # "Text" # ] # ] # ] # ] #]
上記の例の
abc123456789defg
について考えると、abc
からdefg
までの距離は11
です。${MAX_INTERVAL}
は10
で${ADDITIONAL_LAST_INTERVAL}
は1
が指定されています。したがって、最後のフレーズがマッチするしきい値は11になります。以上から、abc123456789defg
はマッチするはずですが、していません。これは、この例が、以下のようにこの問題の発生条件を満たしていて、
${MAX_INTERVAL}
のみが使われているためです。最後として指定されたフレーズが複数のトークンを含む
最後に
$
がついているので、defg$
は最後と指定されています。defg$
はTokenNgram("unify_alphabet", false, "unify_digit", false)
によってde
,ef
,fg
にトークナイズされます。そのフレーズの最後のトークンのサイズが、他のトークンのサイズ以下である
fg
はdefg$
の最後のトークンです。abc123456789defg
は1つのfg
とde
を含みます。そして、dededede
は4つのde
を含みます。したがって、
fg
のサイズは1
で、de
のサイズは5
です。
[近傍フレーズ検索条件] 距離の計算方法を修正しました。
この問題によって、近傍フレーズ検索を使った場合に、ヒットしないはずのレコードがヒットすることがあります。
[highlight_html]
loose_symbol=true
の時にハイライト位置がずれることがある問題を修正しました。
感謝#
Carlo Cabreraさん
13.0.0リリース - 2023-02-09#
メジャーバージョンアップです! メジャーバージョンアップですが、互換性は壊れていないので、データベースを再構築することなく13.0.0へアップグレードできます。
まずはじめに 13.0.0の主な変更点を紹介します。次に、Groonga 12.0.0 から 12.1.2 までの変更点を紹介します。
改良#
[ノーマライザー] Unicode 15.0 の NFKC(Normalization Form Compatibility Composition)をベースにしたノーマライザー
NormalizerNFKC150
を新しく追加しました。[トークンフィルター] Unicode 15.0 の NFKC(Normalization Form Compatibility Composition)をベースにしたトークンフィルター
TokenFilterNFKC150
を新しく追加しました。[NormalizerNFKC150]
NormalizerNFKC\*
に以下の新しいオプションを追加しました。unify_katakana_gu_small_sounds
このオプションを使うことで、"グァ -> ガ", "グィ -> ギ", "グェ -> ゲ", "グォ -> ゴ"と正規化できます。
以下は
unify_katakana_gu_small_sounds
オプションの使用例です。table_create --name Countries --flags TABLE_HASH_KEY --key_type ShortText column_create --table Countries --name name --type ShortText load --table Countries [ {"_key":"JP","name":"日本"}, {"_key":"GT","name":"グァテマラ共和国"}, ] table_create \ --name idx_contry_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_gu_small_sounds", true)' column_create --table idx_contry_name --name contry_name --flags COLUMN_INDEX|WITH_POSITION --type Countries --source name select --table Countries --query name:@ガテマラ共和国 # [ # [0, # 0, # 0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 2, # "GT", # "グァテマラ共和国" # ] # ] # ] # ]
unify_katakana_di_sound
このオプションを使うことで、"ヂ -> ジ"と正規化できます。
以下は、
unify_katakana_di_sound
オプションの使用例です。table_create --name Foods --flags TABLE_HASH_KEY --key_type ShortText column_create --table Foods --name name --type ShortText load --table Foods [ {"_key":"1","name":"チジミ"}, {"_key":"2","name":"パジョン"}, ] table_create \ --name idx_food_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_di_sound", true)' column_create --table idx_food_name --name food_name --flags COLUMN_INDEX|WITH_POSITION --type Foods --source name select --table Foods --query name:@チヂミ # [ # [ # 0, # 0, # 0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # "1", # "チジミ" # ] # ] # ] # ]
unify_katakana_wo_sound
このオプションを使うことで、"ヲ -> オ"と正規化できます。
以下は、
unify_katakana_wo_sound
オプションの使用例です。table_create --name Foods --flags TABLE_HASH_KEY --key_type ShortText column_create --table Foods --name name --type ShortText load --table Foods [ {"_key":"1","name":"アヲハタ"}, {"_key":"2","name":"ヴェルデ"}, {"_key":"3","name":"ランプ"}, ] table_create \ --name idx_food_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_wo_sound", true)' column_create --table idx_food_name --name food_name --flags COLUMN_INDEX|WITH_POSITION --type Foods --source name select --table Foods --query name:@アオハタ # [ # [ # 0, # 0, # 0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # "1", # "アヲハタ" # ] # ] # ] # ]
unify_katakana_zu_small_sounds
このオプションを使うことで、"ズァ -> ザ", "ズィ -> ジ", "ズェ -> ゼ", "ズォ -> ゾ"と正規化できます。
以下は、
unify_katakana_zu_small_sounds
オプションの使用例です。table_create --name Cities --flags TABLE_HASH_KEY --key_type ShortText column_create --table Cities --name name --type ShortText load --table Cities [ {"_key":"1","name":"ガージヤーバード"}, {"_key":"2","name":"デリー"}, ] table_create \ --name idx_city_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_zu_small_sounds", true)' column_create --table idx_city_name --name city_name --flags COLUMN_INDEX|WITH_POSITION --type Cities --source name select --table Cities --query name:@ガーズィヤーバード # [ # [ # 0, # 0, # 0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # "1", # "ガージヤーバード" # ] # ] # ] # ]
unify_katakana_du_sound
このオプションを使うことで、"ヅ -> ズ"と正規化できます。
以下は、
unify_katakana_du_sound
オプションの使用例です。table_create --name Plants --flags TABLE_HASH_KEY --key_type ShortText column_create --table Plants --name name --type ShortText load --table Plants [ {"_key":"1","name":"ハスノカヅラ"}, {"_key":"2","name":"オオツヅラフジ"}, {"_key":"3","name":"アオツヅラフジ"}, ] table_create \ --name idx_plant_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_du_sound", true)' column_create --table idx_plant_name --name plant_name --flags COLUMN_INDEX|WITH_POSITION --type Plants --source name select --table Plants --query name:@ツズラ # [ # [ # 0, # 0, # 0 # ], # [ # [ # [ # 2 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 2, # "2", # "オオツヅラフジ" # ], # [ # 3, # "3", # "アオツヅラフジ" # ] # ] # ] # ]
unify_katakana_trailing_o
このオプションによって、以下の文字を正規化できます。
"オオ -> オウ"
"コオ -> コウ"
"ソオ -> ソウ"
"トオ -> トウ"
"ノオ -> ノウ"
"ホオ -> ホウ"
"モオ -> モウ"
"ヨオ -> ヨウ"
"ロオ -> ロウ"
"ゴオ -> ゴウ"
"ゾオ -> ゾウ"
"ドオ -> ドウ"
"ボオ -> ボウ"
"ポオ -> ポウ"
以下は、
unify_katakana_trailing_o
オプションの使用例です。table_create --name Sharks --flags TABLE_HASH_KEY --key_type ShortText column_create --table Sharks --name name --type ShortText load --table Sharks [ {"_key":"1","name":"ホオジロザメ"}, {"_key":"2","name":"ジンベイザメ"}, ] table_create \ --name idx_shark_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_trailing_o", true)' column_create --table idx_shark_name --name shark_name --flags COLUMN_INDEX|WITH_POSITION --type Sharks --source name select --table Sharks --query name:@ホウジロザメ # [ # [ # 0, # 0, # 0 # ], # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # "1", # "ホオジロザメ" # ] # ] # ] # ]
unify_katakana_du_small_sounds
このオプションを使うことで、 "ヅァ -> ザ", "ヅィ -> ジ", "ヅェ -> ゼ", "ヅォ -> ゾ"と正規化できます。
以下は、
unify_katakana_du_small_sounds
オプションの使用例です。table_create --name Airports --flags TABLE_HASH_KEY --key_type ShortText column_create --table Airports --name name --type ShortText load --table Airports [ {"_key":"HER","name":"イラクリオ・ニコスカザンヅァキス国際空港"}, {"_key":"ATH","name":"アテネ国際空港"}, ] table_create \ --name idx_airport_name \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer 'NormalizerNFKC150("unify_katakana_du_small_sounds", true)' column_create --table idx_airport_name --name airport_name --flags COLUMN_INDEX|WITH_POSITION --type Airports --source name select --table Airports --query name:@ニコスカザンザキス # [ # [ # [ # 1 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "_key", # "ShortText" # ], # [ # "name", # "ShortText" # ] # ], # [ # 1, # "HER", # "イラクリオ・ニコスカザンヅァキス国際空港" # ] # ] # ]
[Oracle Linux] Oracle Linux 8と9 向けのパッケージを新しくサポートしました。
感謝#
篠田さん
i10aさん
naoaさん
shinononさん
Zhanzhao (Deo) Liangさん
David CARLIERさん
Groonga 12.0.0 から 12.1.2 までの主な変更点#
ハイライト#
[ノーマライザー]
NormalizerHTML
を追加しました。(実験的)NormalizerHTML
はHTML用のノーマライザーです。現在
NormalizerHTML
は<span>
や</span>
といったタグの削除と、&
や&
といった文字参照の展開を行います。以下は
NormalizerHTML
の例です。normalize NormalizerHTML "<span> Groonga & Mroonga & Rroonga </span>" # [[0,1666923364.883798,0.0005481243133544922],{"normalized":" Groonga & Mroonga & Rroonga ","types":[],"checks":[]}]
この例では、
<span>
と</span>
は削除され、&
と&
は&
に展開されています。タグを削除するかどうかは
remove_tag
オプションで指定できます。(remove_tag
オプションのデフォルト値はtrue
です。)normalize 'NormalizerHTML("remove_tag", false)' "<span> Groonga & Mroonga & Rroonga </span>" # [[0,1666924069.278549,0.0001978874206542969],{"normalized":"<span> Groonga & Mroonga & Rroonga </span>","types":[],"checks":[]}]
この例では、
<span>
と</span>
は削除されていません。文字参照を展開するかどうかは
expand_character_reference
オプションで指定できます。(expand_character_reference
オプションのデフォルト値はtrue
です。)normalize 'NormalizerHTML("expand_character_reference", false)' "<span> Groonga & Mroonga & Rroonga </span>" # [[0,1666924357.099782,0.0002346038818359375],{"normalized":" Groonga & Mroonga & Rroonga ","types":[],"checks":[]}]
この例では、
&
と&
は展開されていません。
[snippet],[snippet_html] 入力としてベクターをサポートしました。[groonga-dev,04956][Reported by shinonon]
例えば、以下のように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" # ] # ] # ] # ] # ]
[query_expand] 同義語グループをサポートしました。
同義語検索をする場合、今までは、以下のようにキーワードとその同義語をそれぞれ定義していました。
table_create Thesaurus TABLE_PAT_KEY ShortText --normalizer NormalizerAuto # [[0, 1337566253.89858, 0.000355720520019531], true] column_create Thesaurus synonym COLUMN_VECTOR ShortText # [[0, 1337566253.89858, 0.000355720520019531], true] load --table Thesaurus [ {"_key": "mroonga", "synonym": ["mroonga", "tritonn", "groonga mysql"]}, {"_key": "groonga", "synonym": ["groonga", "senna"]} ]
上記のケースでは、
mroonga
を検索した場合、 Groongaは、意図通り、mroonga OR tritonn OR "groonga mysql" を検索しますが、
tritonnを検索した場合は、 Groongaは、
tritonnのみを検索します。
tritonnを検索した場合でも、
tritonn OR mroonga OR "groonga mysql"` と検索した場合、以下のように定義を追加する必要がありました。load --table Thesaurus [ {"_key": "tritonn", "synonym": ["tritonn", "mroonga", "groonga mysql"]}, ]
多くのケースでは、
mroonga
をmroonga OR tritonn OR "groonga mysql"
と展開した場合、tritonn
や"groonga mysql"
もmroonga OR tritonn OR "groonga mysql"
と展開して欲しくなりますが、今までは、そのようなケースでは定義を追加する必要がありました。したがって、対象のキーワードに同義語がたくさんあると、同じような定義をたくさん定義する必要があるため、同義語の定義が煩雑でした。加えて、同義語を削除する際も、多くのレコードを削除する必要があるので面倒でした。
今回のリリースから同義語の代表値を決めることで一つのグループを作れるようになりました。例えば、以下のすべてのキーワードは、 "mroonga" グループです。
load --table Synonyms [ {"_key": "mroonga": "representative": "mroonga"} ] load --table Synonyms [ {"_key": "tritonn": "representative": "mroonga"}, {"_key": "groonga mysql": "representative": "mroonga"} ]
このケースでは、
mroonga
はmroonga OR tritonn OR "groonga mysql"
と展開されます。また、tritonn
や"groonga mysql"
もmroonga OR tritonn OR "groonga mysql"
と展開されます。同義語を削除する際も、対象のレコードを削除するだけです。例えば、同義語から
"groonga mysql"
を削除する場合は、{"_key": "groonga mysql": "representative": "mroonga"}
を削除するだけです。
[index_column_have_source_record] 新しい関数
index_column_have_source_record()
を追加しました。インデックスに存在するトークンがGroongaに登録されているいずれかのレコードに含まれているかどうかを確認できます。
Groongaは、レコードの更新によってどのレコードからも使われていないトークンがあっても、それを削除しません。したがって、例えば、オートコンプリート機能を使っていると、検索候補としてどのレコードにも含まれていないトークンを返す可能性がありますが、この関数をつかうことで、不要なトークンを返さないようにできます。
この関数は、トークンがどのレコードにも含まれていないことを検出できるからです。
[select] 新しい引数
drilldown_max_n_target_records
とdrilldown[${LABEL}].max_n_target_records
を追加しました。ドリルダウン対象のテーブル(フィルター結果)の中のうち最大で何レコードをドリルダウンに使うかを指定します。もし、フィルター結果のレコード数が指定した値より大きかったらフィルターした結果内のいくつかのレコードはドリルダウンには使われません。これらの引数のデフォルト値は、
-1
です。これらの引数に-1
がセットされた場合、Groongaは全てのレコードをドリルダウンに使います。この機能はフィルター結果が非常に大きくなるかもしれない場合に有用です。大きなフィルター結果に対するドリルダウンは遅くなることがあるためです。この機能を使うことでドリルダウンに使うレコード数を制限できます。
以下はドリルダウンに使う最大レコード数を制限する例です。最後の2レコード(
{"_id": 4, "tag": "Senna"}
と{"_id": 5, "tag": "Senna"}
)は使われていません。table_create Entries TABLE_HASH_KEY ShortText column_create Entries content COLUMN_SCALAR Text column_create Entries n_likes COLUMN_SCALAR UInt32 column_create Entries tag COLUMN_SCALAR ShortText table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content load --table Entries [ {"_key": "The first post!", "content": "Welcome! This is my first post!", "n_likes": 5, "tag": "Hello"}, {"_key": "Groonga", "content": "I started to use Groonga. It's very fast!", "n_likes": 10, "tag": "Groonga"}, {"_key": "Mroonga", "content": "I also started to use Mroonga. It's also very fast! Really fast!", "n_likes": 15, "tag": "Groonga"}, {"_key": "Good-bye Senna", "content": "I migrated all Senna system!", "n_likes": 3, "tag": "Senna"}, {"_key": "Good-bye Tritonn", "content": "I also migrated all Tritonn system!", "n_likes": 3, "tag": "Senna"} ] select Entries \ --limit -1 \ --output_columns _id,tag \ --drilldown tag \ --drilldown_max_n_target_records 3 # [ # [ # 0, # 1337566253.89858, # 0.000355720520019531 # ], # [ # [ # [ # 5 # ], # [ # [ # "_id", # "UInt32" # ], # [ # "tag", # "ShortText" # ] # ], # [ # 1, # "Hello" # ], # [ # 2, # "Groonga" # ], # [ # 3, # "Groonga" # ], # [ # 4, # "Senna" # ], # [ # 5, # "Senna" # ] # ], # [ # [ # 2 # ], # [ # [ # "_key", # "ShortText" # ], # [ # "_nsubrecs", # "Int32" # ] # ], # [ # "Hello", # 1 # ], # [ # "Groonga", # 2 # ] # ] # ] # ]
概要#
改良#
[httpd] バンドルしているnginxのバージョンを1.23.3に更新しました。
[load]
load
のスローログの出力に対応しました。[API] 新しいAPI
grn_is_reference_count_enable()
を追加しました。[status] 新しい項目
back_trace
とreference_count
を追加しました。
[AlmaLinux] AlmaLinux 9 向けのパッケージをサポートしました。
[escalate]
escalate()
関数のドキュメントを追加しました。[ノーマライザー]
NormalizerHTML
を追加しました。(実験的)[httpd] バンドルしているnginxのバージョンを1.23.2に更新しました。
メモリーが不足した際に、同じログが大量に出力されないように変更しました。
escalate()
関数(実験的)の仕様を使いやすいように変更しました。[その他: CMakeを使ってビルド] CMakeを使ってビルドする方法を追加しました。
[その他] GNU Autotoolsを使ってビルドする場合に、Apache Arrowの機能を有効化/無効化する方法について追加しました。
[select] drilldowns[${LABEL}].table のドキュメントを追加しました。
[国際化] 翻訳方法を更新しました。
新しい関数
escalate()
を追加しました。(実験的)[httpd] バンドルしているnginxのバージョンを1.23.1に更新しました。
[select]
--n_workers
オプションのドキュメントを追加しました。
groonga-delta用の新しいMuninプラグインを追加しました。
[column_copy] 重み付きベクターをサポートしました。
[Ubuntu] Ubuntu 21.10 (Impish Indri) のサポートをやめました。
[Debian GNU/Linux] Debian 10 (buster) のサポートをやめました。
[select] 検索エスカレーションによる前方一致検索のパフォーマンスを少し改善しました。
[select]
drilldowns[LABEL]._key
に重み付き参照ベクターカラムを指定できるようになりました。[select]
query
やfilter
やpost_filter
を使っていても、ドリルダウンのキーに重み付き参照ベクターカラムを指定できるようになりました。
[Ubuntu] Ubuntu 22.04 (Jammy Jellyfish)をサポートしました。
groonga-benchmark
の提供をやめました。[status] 新しい項目
memory_map_size
を追加しました。
[logical_count]
logical_count
実行中のメモリー使用量を改善しました。[dump]
MISSING_IGNORE/MISSING_NIL
をサポートしました。[snippet],[snippet_html] 入力としてベクターをサポートしました。
[
vector_join
] 新しい関数vector_join()
を追加しました。[インデックス構築] 動的インデックス構築のようにとても大きなトークンを無視するようにしました。
[logical_range_filter] シャードを処理した直後に参照を減らすようにしました。
クラッシュリカバリー機能の安定性が向上しました。
無名マッピングが利用可能な時のmmapのパフォーマンスを向上しました。
[インデックス構築] 以下のタイプのカラムで静的インデックス構築をサポートしました。
[column_create] 新しいフラグ
MISSING_*
とINVALID_*
を追加しました。[dump][column_list]
MISSING_*
とINVALID_*
フラグをサポートしました。[schema]
MISSING_*
とINVALID_*
フラグをサポートしました。Amazon Linux 2向けのパッケージを提供するようにしました。
[Windows] Visual Studio 2017 でのビルドをやめました。
[query_expand] 同義語グループをサポートしました。
[query_expand] 同義語グループにベクターを使えるようにしました。
環境変数によって、バックトレースを無効にできるようにしました。
[select]
--slices
のパフォーマンスを改善しました。[Windows] VisualStudio 2022 をサポートしました。
[select] 近傍検索でそれぞれの要素ごとの距離を指定できるようになりました。
[Groonga HTTPサーバー] RPMパッケージのGroongaであっても、
groonga-server-http
を使えるようにしました。
[sub_filter] 新しいオプション
pre_filter_threshold
を追加しました。[index_column_have_source_record] 新しい関数
index_column_have_source_record()
を追加しました。[NormalizerNFKC130] 新しいオプション
strip
を追加しました。[select] 新しい引数
drilldown_max_n_target_records
とdrilldown[${LABEL}].max_n_target_records
を追加しました。[httpd] バンドルしているnginxのバージョンを1.21.6に更新しました。
修正#
[select]
command_version
が3
のとき、drilldown
の結果のラベルが不正になる問題を修正しました。[NormalizerTable] 特定の定義が
NormalizerTable
に存在する場合、Groongaがクラッシュすることがある問題を修正しました。
NormalizerTable で冪等でない(繰り返し実行すると結果が変わることがある)定義をした時に、Groongaが誤った結果を返すことがある問題を修正しました。
OR検索実行中に
request_cancel
を実行した場合、Groongaの応答が遅くなることがある問題を修正しました。
n_workers
オプションを使ってドリルダウンを並行して実行したときにGroongaがクラッシュすることがある問題を修正しました。[select]
--filter
に非常に長い式を指定するとシンタックスエラーになる問題を修正しました。
検索実行中に
request_cancel
を実行した時Groongaの応答が遅くなることがある問題を修正しました。文字列リストをint32のベクターにキャストできない問題を修正しました。
GroongaのMuninプラグインがAlmaLinux 8 とCentOS 7上で動作しない問題を修正しました。
パトリシアトライのテーブルにキーを追加できなくなることがある問題を修正しました。