お知らせ - 13系 — Groonga v16.0.2ドキュメント

本文へスキップ
`Ctrl`+`K`

# お知らせ - 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] 以下の３つの条件が成立した時にクラッシュする問題を修正しました。

  1. クエリーが2つまたはそれ以上のマルチバイト文字を持っている場合。

  2. `${ASCII}${ASCII}${MULTIBYTE}*` という形の文字列がパトリシアトライのテーブルにある場合。

  3. `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`, and `COMPRESS_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)'   "お あ ａ ア ｉ ｱ オ"   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)'   "お あ ａ ア ｉ ｱ オ"   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` とみなされます。したがって、この問題が発生した場合、余分にレコードがヒットすることがあります。

  この問題は以下の場合に発生します。

  1. `*ONP` で `${MAX_PHRASE_INTERVALS}` を使用している

  2. マッチした左側のフレーズに含まれるトークンの数が、 `${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` とみなされているためです。

  1. `*ONP` で `${MAX_PHRASE_INTERVALS}` を使用している

     `*ONP-1,0,1 "abc def"` は `${MAX_PHRASE_INTERVALS}` を使用している。

  2. マッチした左側のフレーズに含まれるトークンの数が、 `${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}` が使用されます。

  この問題は以下の場合に発生します。

  1. 最後として指定されたフレーズが複数のトークンを含む

  2. そのフレーズの最後のトークンのサイズが、他のトークンのサイズ以下である

     - トークンサイズとは、全レコード中に出現するそのトークンの数です。

  以下はこの問題の例です。

      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}` のみが使われているためです。

  1. 最後として指定されたフレーズが複数のトークンを含む

     最後に `$` がついているので、 `defg$` は最後と指定されています。

     `defg$` は `TokenNgram("unify_alphabet", false, "unify_digit", false)` によって `de`, `ef`, `fg` にトークナイズされます。

  2. そのフレーズの最後のトークンのサイズが、他のトークンのサイズ以下である

     `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 までの主な変更点

#### ハイライト

[12.0.9リリース - 2022-10-28]

- [ノーマライザー] `NormalizerHTML` を追加しました。（実験的）

  `NormalizerHTML` はHTML用のノーマライザーです。

  現在 `NormalizerHTML` は `<span>` や `</span>` といったタグの削除と、`&amp;` や `&#38;` といった文字参照の展開を行います。

  以下は `NormalizerHTML` の例です。

      normalize NormalizerHTML "<span> Groonga &amp; Mroonga &#38; Rroonga </span>"
      # [[0,1666923364.883798,0.0005481243133544922],{"normalized":" Groonga & Mroonga & Rroonga ","types":[],"checks":[]}]

  この例では、 `<span>` と `</span>` は削除され、 `&amp;` と `&#38;` は `&` に展開されています。

  タグを削除するかどうかは `remove_tag` オプションで指定できます。(`remove_tag` オプションのデフォルト値は `true` です。)

      normalize 'NormalizerHTML("remove_tag", false)' "<span> Groonga &amp; Mroonga &#38; 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 &amp; Mroonga &#38; Rroonga </span>"
      # [[0,1666924357.099782,0.0002346038818359375],{"normalized":" Groonga &amp; Mroonga &#38; Rroonga ","types":[],"checks":[]}]

  この例では、 `&amp;` と `&#38;` は展開されていません。

[12.0.3リリース - 2022-04-29]

- [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"
      #         ]
      #       ]
      #     ]
      #   ]
      # ]

[12.0.1リリース - 2022-02-28]

- [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"}` を削除するだけです。

[12.0.0リリース - 2022-02-09]

- [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
       #       ]
       #     ]
       #   ]
       # ]

### 概要

#### 改良

[12.1.2リリース - 2023-01-29]

- [httpd] バンドルしているnginxのバージョンを1.23.3に更新しました。

[12.1.1リリース - 2023-01-06]

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

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

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

[12.1.0リリース - 2022-11-29]

- [load] `load` のスローログの出力に対応しました。

- [API] 新しいAPI `grn_is_reference_count_enable()` を追加しました。

- [status] 新しい項目 `back_trace` と `reference_count` を追加しました。

[12.0.9リリース - 2022-10-28]

- [AlmaLinux] AlmaLinux 9 向けのパッケージをサポートしました。

- [escalate] `escalate()` 関数のドキュメントを追加しました。

- [ノーマライザー] `NormalizerHTML` を追加しました。（実験的）

- [httpd] バンドルしているnginxのバージョンを1.23.2に更新しました。

- メモリーが不足した際に、同じログが大量に出力されないように変更しました。

[12.0.8リリース - 2022-10-03]

- `escalate()` 関数（実験的）の仕様を使いやすいように変更しました。

- [その他: CMakeを使ってビルド] CMakeを使ってビルドする方法を追加しました。

- [その他] GNU Autotoolsを使ってビルドする場合に、Apache Arrowの機能を有効化/無効化する方法について追加しました。

- [select] drilldowns[${LABEL}].table のドキュメントを追加しました。

- [国際化] 翻訳方法を更新しました。

[12.0.7リリース - 2022-08-29]

- 新しい関数 `escalate()` を追加しました。(実験的)

- [httpd] バンドルしているnginxのバージョンを1.23.1に更新しました。

- [select] `--n_workers` オプションのドキュメントを追加しました。

[12.0.6リリース - 2022-08-04]

- groonga-delta用の新しいMuninプラグインを追加しました。

- [column_copy] 重み付きベクターをサポートしました。

- [Ubuntu] Ubuntu 21.10 (Impish Indri) のサポートをやめました。

- [Debian GNU/Linux] Debian 10 (buster) のサポートをやめました。

[12.0.5リリース - 2022-06-29]

- [select] 検索エスカレーションによる前方一致検索のパフォーマンスを少し改善しました。

- [select] `drilldowns[LABEL]._key` に重み付き参照ベクターカラムを指定できるようになりました。

- [select] `query` や `filter` や `post_filter` を使っていても、ドリルダウンのキーに重み付き参照ベクターカラムを指定できるようになりました。

[12.0.4リリース - 2022-06-06]

- [Ubuntu] Ubuntu 22.04 (Jammy Jellyfish)をサポートしました。

- `groonga-benchmark` の提供をやめました。

- [status] 新しい項目 `memory_map_size` を追加しました。

[12.0.3リリース - 2022-04-29]

- [logical_count] `logical_count` 実行中のメモリー使用量を改善しました。

- [dump] `MISSING_IGNORE/MISSING_NIL` をサポートしました。

- [snippet],[snippet_html] 入力としてベクターをサポートしました。

- [`vector_join`] 新しい関数 `vector_join()` を追加しました。

- [インデックス構築] 動的インデックス構築のようにとても大きなトークンを無視するようにしました。

[12.0.2リリース - 2022-03-29]

- [logical_range_filter] シャードを処理した直後に参照を減らすようにしました。

- クラッシュリカバリー機能の安定性が向上しました。

- 無名マッピングが利用可能な時のmmapのパフォーマンスを向上しました。

- [インデックス構築] 以下のタイプのカラムで静的インデックス構築をサポートしました。

- [column_create] 新しいフラグ `MISSING_*` と `INVALID_*` を追加しました。

- [dump][column_list] `MISSING_*` と `INVALID_*` フラグをサポートしました。

- [schema] `MISSING_*` と `INVALID_*` フラグをサポートしました。

- Amazon Linux 2向けのパッケージを提供するようにしました。

- [Windows] Visual Studio 2017 でのビルドをやめました。

[12.0.1リリース - 2022-02-28]

- [query_expand] 同義語グループをサポートしました。

- [query_expand] 同義語グループにベクターを使えるようにしました。

- 環境変数によって、バックトレースを無効にできるようにしました。

- [select] `--slices` のパフォーマンスを改善しました。

- [Windows] VisualStudio 2022 をサポートしました。

- [select] 近傍検索でそれぞれの要素ごとの距離を指定できるようになりました。

- [Groonga HTTPサーバー] RPMパッケージのGroongaであっても、 `groonga-server-http` を使えるようにしました。

[12.0.0リリース - 2022-02-09]

- [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に更新しました。

#### 修正

[12.1.1リリース - 2023-01-06]

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

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

[12.1.0リリース - 2022-11-29]

- [select][ベクターカラム] 重み付きベクターカラムで `WEIGHT_FLOAT32` を指定したとき、結果が整数で表示されていた問題を修正しました。

[12.0.9リリース - 2022-10-28]

- [select] n_workers を指定したとき、Groongaがクラッシュしたり、誤った結果を返すことがある問題を修正しました。

[12.0.8リリース - 2022-10-03]

- NormalizerTable で冪等でない（繰り返し実行すると結果が変わることがある）定義をした時に、Groongaが誤った結果を返すことがある問題を修正しました。

[12.0.7リリース - 2022-08-29]

- OR検索実行中に `request_cancel` を実行した場合、Groongaの応答が遅くなることがある問題を修正しました。

[12.0.6リリース - 2022-08-04]

- `n_workers` オプションを使ってドリルダウンを並行して実行したときにGroongaがクラッシュすることがある問題を修正しました。

- [select] `--filter` に非常に長い式を指定するとシンタックスエラーになる問題を修正しました。

[12.0.4リリース - 2022-06-06]

- 検索実行中に `request_cancel` を実行した時Groongaの応答が遅くなることがある問題を修正しました。

- 文字列リストをint32のベクターにキャストできない問題を修正しました。

- GroongaのMuninプラグインがAlmaLinux 8 とCentOS 7上で動作しない問題を修正しました。

[12.0.3リリース - 2022-04-29]

- パトリシアトライのテーブルにキーを追加できなくなることがある問題を修正しました。