# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# お知らせ

## 8.1.1リリース - 2019-01-29

### 改良

- [logical_select] 新しい引数 `--load_table` 、`--load_columns` 、 `--load_values` を追加しました。
  - `logical_select` の結果を `--load_table` で指定したテーブルへ格納できます。
  - `--load_values` オプションは、`logical_select` の結果のカラムを指定します。
  - `--load_columns` オプションは、`--load_table` で指定したテーブルのカラムを指定します。
  - このようにして、`--load_values` で指定したカラムの値を、 `--load_columns` で指定したカラムへ格納できます。
- インデックスの更新エラー時のログを改善しました。
  - ログに、より詳細な情報を追加しました。
    - 例えば、ポスティングリストのマージに失敗した時にマージ元のバッファーとチャンクを出力します。
    - また、バッファー確保のエラーが発生した時は、バッファーの空き領域と要求サイズをログに出力します。
- [groonga 実行ファイル] 新しいオプション `--log-flags` を追加しました。
  - Groongaのログに出力する項目を指定できます。
  - 以下のような項目を出力できます。
    - タイムスタンプ
    - ログメッセージ
    - ロケーション(ログが出力された場所)
    - プロセスID
    - スレッドID
  - 以下のように接頭辞を指定できます。
    - `+`
      - この接頭辞は、 "フラグを追加する"という意味です。
    - `-`
      - この接頭辞は、"フラグを削除する"という意味です。
    - 接頭辞無しは、"存在しているフラグを置き換える"という意味です。
  - 具体的には、以下のようにフラグ指定できます。
    - `none`
      - ログに何も出力しません。
    - `time`
      - ログにタイムスタンプを出力します。
    - `message`
      - ログにメッセージを出力します。
    - `location`
      - ログの出力場所(ファイル名、行数、関数名)とプロセスIDを出力します。
    - `process_id`
      - ログにプロセスIDを出力します。
    - `pid`
      - このフラグは、 `process_id` のエイリアスです。
    - `thread_id`
      - ログにスレッドIDを出力します。
    - `all`
      - このフラグは、 `none` と `default` 以外の全てのフラグを指定します。
    - `default`
      - ログに、タイムスタンプとログメッセージを出力します。
  - `|` を使って、複数のフラグを指定することもできます。

### 修正

- インデックスの更新エラー発生時にメモリリークする問題を修正しました。

- [ノーマライザー] ステートレスなノーマライザーとステートフルなノーマライザーを同時に使用した時に、それらが誤った結果を返すバグを修正しました。

  > - ステートレスなノーマライザーとは以下です。
  >   - `unify_kana`
  >   - `unify_kana_case`
  >   - `unify_kana_voiced_sound_mark`
  >   - `unify_hyphen`
  >   - `unify_prolonged_sound_mark`
  >   - `unify_hyphen_and_prolonged_sound_mark`
  >   - `unify_middle_dot`
  > - ステートフルなノーマライザーとは以下です。
  >   - `unify_katakana_v_sounds`
  >   - `unify_katakana_bu_sound`
  >   - `unify_to_romaji`

## 8.1.0リリース - 2018-12-29

### 改良

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

### 修正

- `io_flush` コマンド実行後に、DBに対するアンロックが常にフラッシュの実行後になってしまうバグを修正しました。
- 参照先を持たないレコードを持つテーブルに対して `reindex` コマンドを実行した際に、 `reindex` コマンドが終了しないバグを修正しました。

## 8.0.9リリース - 2018-11-29

### 改良

- [トークナイザー] トークナイザーの作成に失敗した際のエラーメッセージにトークナイザーの名前を出力するよう改良。
- [トークナイザー][TokenDelimit] トークンの区切り文字のカスタマイズをサポートしました。
  - 空白以外のトークンを区切り文字に使えます。
- [トークナイザー][TokenDelimit] 新しいオプション `pattern` を追加しました。
  - このオプションにより、区切り文字にに正規表現を指定できます。
- [トークナイザー] 各トークンの情報に `force_prefix_search` の値を追加しました。
  - "force_prefix" は後方互換のため残しています。
- [トークンフィルター] ビルトインのトークンフィルタ `TokenFilterNFKC100` を追加しました。
  - NormalizerNFKC100のように `unify_kana` オプションで、カタカナをひらがなへ変換できます。
- [トークンフィルター][TokenFilterStem] 新しオプション `algorithm` を追加しました。
  - このオプションによって、英語以外の言語(フランス語、スペイン語、ポルトガル語、イタリア語、ルーマニア語、ドイツ語、オランダ語、スウェーデン語、ノルウェー語、デンマーク語、ロシア語、フィンランド語)をステミングできます。
- [トークンフィルター][TokenFilterStopWord] 新しいオプション `column` を追加しました
  - このオプションによって、is_stop_word以外のカラムをスットプワードに指定できます。
- [dump] トークンフィルターのオプションの出力をサポートしました。
  - `TokenNgram` や `TokenMecab` 等のようなオプションを持つトークナイザーを指定した場合、それらのオプションも `table_list` コマンドで出力できます。
- [truncate] トークンフィルターのオプションを持ったテーブルをサポートしました。
  - `TokenFilterStem` や `TokenStopWord` 等のようなオプションを持つトークナイザーを持つテーブルでも `truncate` できます。
- [schema] トークンフィルターのオプションの出力をサポートしました。
- [ノーマライザー] `NormalizerNFKC100` に新しいオプション `unify_to_romaji` を追加しました。
  - このオプションによって、ひらがなとカタカナをローマ字に正規化できます。
- [query-log][show-condition] "func() > 0"をサポートしました。
- [Windows] アンマップ前のフラッシュを確実にするよう改善しました。
- ファイル入力のエラーメッセージを改善しました。
- [httpd] バンドルしているnginxのバージョンを1.15.7に更新しました。
  - CVE-2018-16843とCVE-2018-16844のセキュリティの修正が含まれています。

### 修正

- ウインドウ関数を評価する際にメモリリークする問題を修正しました。

- [groonga-httpd] ログの内容が混在することがあるバグを修正しました。

- output_columnsのスライスのエラーが発生した際に、無効なJSONが生成されるバグを修正しました。

- ネストして参照されているベクターカラムの値を取得する際にメモリリークする問題を修正しました。

- インデックス破損を警告するログを出力する際にクラッシュするバグを修正しました。

- 式の評価で一時的なベクターが再利用された時にクラッシュするバグを修正しました。

  - 例えば、以下のようにベクターを使った式を評価する時にクラッシュします。

  `_score = _score + (vector_size(categories) > 0)`

- deleteコマンドで削除したベクターカラムの値がヒットするバグを修正しました。[dodaisukeさんの報告]

### 感謝

- dodaisukeさん

## 8.0.8リリース - 2018-10-29

### 改良

- [table_list] デフォルトトークナイザーのオプションをサポートしました。

  - `TokenNgram` や `TokenMecab` 等のようなオプションを持つトークナイザーを指定した場合、それらのオプションも `table_list` コマンドで出力できます。

- [select] `record @ 'query'` を使ったシーケンシャルマッチでノーマライザーのオプションをサポートしました。

- [truncate] トークナイザーのオプションを持ったテーブルをサポートしました。

  - `TokenNgram` や `TokenMecab` 等のようなオプションを持つトークナイザーを持つテーブルでも `truncate` できます。

- [トークナイザー][TokenMecab] `TokenMecab` に `target_class` オプションを追加しました。

  - このオプションは、指定した品詞のトークンを検索します。例えば、名詞のみを検索することができます。

  - このオプションは、以下のようにサブクラスを指定することや、 `+` や `-` を使って、特定の品詞を追加または除外することもできます。したがって、以下のように代名詞を除外して検索することもできます。

    `'TokenMecab("target_class", "-名詞/代名詞", "target_class", "+")'`

- [io_flush] `io_flush` 中のデータベースのロックをサポートしました。

  - `io_flush` 実行中に `io_flush` 対象のテーブルを削除するとGroongaがクラッシュする問題があったためです。

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

  - この関数は、指定した型へキャストします。もし、指定した値がキャストできない場合、値は、指定したデフォルト値になります。

- 条件式の評価順序の最適化を追加しました。(実験的)

  - 以下のように環境変数を設定することでこの機能を有効にできます。

    `GRN_EXPR_OPTIMIZE=yes`

- インデックス検索可能な正規表現に `(?-mix:XXX)` 記法をサポートしました。 [groonga-dev,04683][ Masatoshi SEKIさんの報告]

  - `(?-mix:XXX)` は XXX と同じ扱いです。

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

- Ubuntu 18.10 (Cosmic Cuttlefish)をサポートしました。

### 修正

- Groonga GQTP サーバーが新しい接続を受け付けなくなることがあるバグを修正しました。[groonga-dev,04688][Yutaro Shimamuraさんの報告]
  - quitを使わずにクライアントプロセスを中断した時に発生します。

### 感謝

- Masatoshi SEKIさん
- Yutaro Shimamuraさん

## 8.0.7リリース - 2018-09-29

### 改良

- [トークナイザー][TokenMecab] Mecabのメタデータの出力をサポートしました。

  - `TokenMecab` に `include_class` オプションを追加しました。

    このオプションは、Mecabのメタデータの `class` と `subclass` を出力します。

  - `TokenMecab` に `include_reading` オプションを追加しました。

    このオプションは、Mecabのメタデータの `reading` を出力します。

  - `TokenMecab` に `include_form` オプションを追加しました。

    このオプションは、Mecabのメタデータの `inflected_type` と `inflected_form` 、 `base_form` を出力します。

  - `TokenMecab` に `use_reading` オプションを追加しました。

    このオプションは、読みがなによる検索をサポートします。

    このオプションは、読みがなを使った検索をするため、表記ゆれの対策として有用です。

- [plugin] 複数のディレクトリからプラグインを取得できるようになりました。

  `GRN_PLUGINS_PATH` に複数のディレクトリを指定できます。Windowsの場合は、":"でWindows以外では、";"で区切ります。

  `GRN_PLUGINS_PATH` は、 `GRN_PLUGINS_DIR` より優先度が高いです。現状、このオプションはWindowsではサポートされていません。

- [トークナイザー][TokenNgram] `TokenNgram` に `unify_alphabet` オプションを追加しました。

  `TokenNgram("unify_alphabet", false)` は `TokenBigramSplitAlpha` と同じ動作です。

- [トークナイザー][TokenNgram] `TokenNgram` に `unify_symbol` オプションを追加しました。

  `TokenNgram("unify_symbol", false)` は、 `TokenBigramSplitSymbol` と同じ動作です。

- [トークナイザー][TokenNgram] `TokenNgram` に `unify_digit` オプションを追加しました。

  `TokenNgram("unify_digit", false)` は、 `TokenBigramSplitDigit` と同じ動作です。

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

### 修正

- いくつかのケースでの誤ったスコア計算を修正しました。
  - ブール値に数値を加算、乗算または除算するときに発生します。
  - `！=` や `==` を使ってスカラーとベクトルの列を比較するときに発生します。

## 8.0.6リリース - 2018-08-29

### 改良

- [トークナイザー][TokenMecab] `chunked_tokenize` と `chunk_size_threshold` の両オプションに対応しました。
- [optimizer] query family expressionの推定に対応しました。`column @ query` や `column @~ pattern` のようなquery family expressionについて、より効果的な実行計画を立てられます。
- [optimizer] オプティマイザをプラグインから組み込みの機能に変更し、初期状態で無効としました。環境変数を `GRN_EXPR_OPTIMIZE=yes` と定義するか、従来通りに `expression_rewriters` テーブルを使う事で機能を有効化できます。
- 充分に絞り込み済みの場合において、初期状態でシーケンシャルサーチを行うようにしました。現在の結果が充分に少数である場合、シーケンシャルサーチはインデックス検索よりも高速です。現在の結果が元の結果の1%で1000件未満の場合、インデックス検索可能な場合であってもシーケンシャルサーチが使われます。この機能は環境変数で `GRN_TABLE_SELECT_ENOUGH_FILTERED_RATIO=0.0` と設定する事で無効化できます。
- [load] エラーメッセージにテーブル名を含めるようにしました。
- [load] `lock_table` オプションを追加しました。`--lock_table yes` が指定された場合、カラムの更新と `--each` の適用を行っている間、`load` は対象のテーブルをロックします。このオプションは `load` と `delete` の衝突を防ぎますが、読み込みの性能を低下させるでしょう。
- [vector_find] サポートされていないモードでクラッシュしないようにしました。

### 修正

- [index] `HASH_KEY` を伴ったテキストのベクターに対するオフラインでのインデックス構築に関して、誤ったセクションIDを持つインデックスが構築されてしまうバグを修正しました。
- `--match_columns 'index[0] || index[9]'` が誤ったセクションを使用してしまう問題を修正しました。
- [highlighter] 語彙表がハッシュテーブルで、且つキーワードがN-gramのNよりも少ない文字数の場合に、誤ったハイライトが行われていた問題を修正しました。
- [mruby] 本当のエラーが隠されていた問題を修正しました。mrubyは引数無しで投げられたエラーの伝搬に対応していません。https://github.com/mruby/mruby/issues/290
- [トークナイザー][TokenNgram loose]: クエリが曖昧な種類のみであった場合に検索結果が見つからない問題を修正しました。語彙表を伴っての `highlight_html()` も同様に壊れていました。
- テキストから数値への変換において、後続するゴミ部分が無視されていた問題を修正しました。 "0garbage" は変換エラーになります。
- `reference_column >= 'key_value'` に当てはまる場合の最適化の問題を修正しました。

## 8.0.5リリース - 2018-07-29

### 改良

- [スクリプト構文] 類似文書検索の補足説明とその日本語訳を追加しました。 [GitHub groonga/GitHub#858] [堀本さんがパッチ提供]
- [time_classify_day_of_week] 新しい関数 `time_classify_day_of_week()` を追加しました。
- `-fstack-protector` で警告を抑制するようにしました。（OBATA Akioさんが提案）
- 新しいAPI `time_format_iso8601()` を追加しました。
- `grn_raw_string` 構造体を公開。
- 新しいAPI: `grn_obj_clear_option_values()` を追加しました。永続的なデータベースのremoveと一時的なデータベースのcloseの際にオプションの値を消去できます。
- [log] `[ii][update][one]` のエラーメッセージにインデックスカラム名を出力するようにしました。
- [httpd] バンドルしているnginxのバージョンを1.15.2に更新しました。
- [Ubuntu] Ubuntu 17.10 (Artful Aardvark）のサポートをやめました。2018年7月19日でサポートが切れた（EOLになった）ためです。
- [Debian GNU/Linux] jessieのサポートをやめました。Debianのセキュリティ＆リリースチームはもはやjessieの更新を提供しません。

### 修正

- POSTでの `/d/load` へのデータ送信が中断された後に誤った結果が返されていたのを修正しました。
- KyTeaに関する間違った関数呼び出しを修正しました。
- [grndb] `--force-truncate` オプションのラベルを追加しました。
- `groonga-normalizer-mysql` のようにプラグインとして提供されているノーマライザーでオプションを使った場合に、データベースを終了するときにクラッシュする問題を修正しました。
- ノーマライザーとトークナイザーのオプションが無視される場合があった問題を修正しました。この問題は同じオブジェクトIDが再利用された場合に発生していました。

## 8.0.4リリース - 2018-06-29

### 改良

- [log] `[ii][update][one]` のエラーメッセージにサブエラーを追加しました。
- 新しいAPI `grn_highlighter_clear_keywords()` を追加しました。
- 新しいpredicate `grn_obj_is_number_family_bulk()` を追加しました。
- 新しいAPI `grn_plugin_proc_get_value_mode()` を追加しました。
- [vector_find] 新しい関数 `vector_find()` を追加しました。
- msgpackでのmemcpyの警告を抑制しました。
- mrubyを1.0.0から1.4.1に更新しました。
- [doc][grn_obj] `grn_obj_is_index_column()` のAPIリファレンスを追加しました。
- [windows] printfフォーマットの警告を抑制しました。
- [windows] msgpackによる警告を抑制しました。
- [grn_obj][Plugin] エンコーディングコンバーターを追加しました。ルール:
  - grn_ctx::errbuf: grn_encoding
  - grn_logger_put: grn_encoding
  - mruby: UTF-8
  - path: locale
- [mrb] `LocaleOutput` を追加しました。
- [windows] イメージのパスのgrn_encodingへの変換をサポートしました。
- [トークナイザー][TokenMecab] エラーメッセージのエンコーディングを変換するようにしました。
- [window_sum] 対象カラムとしての動的カラムをサポートしました。
- [doc][grn_obj] `grn_obj_is_vector_column()` のAPIリファレンスを追加しました。
- [column_create] より多くのバリデーションを追加しました。
  - 1: ベクターカラムの全文検索インデックスは `WITH_SECTION` フラグが必要です。（ただし、 `WITH_POSITION` あり、 `WITH_SECTION` なしのTokenDelmitは許容されます。これはタグ検索に便利なパターンです。)
  - 2: ベクターカラムの全文検索インデックスはマルチカラムインデックスであってはいけません。詳細: https://github.com/groonga/groonga/commit/08e2456ba35407e3d5172f71a0200fac2a770142
- [grndb] 実装が不十分だったため、ログのチェックを一時的に無効にしました

### 修正

- [sub_filter] 十分にフィルターされたケースで、スコアが多すぎる問題を修正
- KyTeaがインストールされているとビルドに失敗する問題を修正しました。
- [grndb] 出力チャネルを修正しました。
- [query-log][show-condition] クラッシュするバグを修正しました（まだ残っている可能性があります）。
- [highlighter][lexicon] ハイライトされないバグを修正しました。キーワードの長さがN未満（N-gramのN。多くの場合はBigramなので2未満）の場合、キーワードがハイライトされていませんでした。
- [windows] base path検出時の問題を修正しました。システムロケールのDLLパスが、CP932での「U+8868 CJK UNIFIED IDEOGRAPH-8868」のように0x5c （ASCIIでの `\` )を含む場合に問題がありました。
- [トークナイザー][TokenNgram] 最初の文字の長さの誤りを修正しました。この問題は、「U+3231 PARENTHESIZED IDEOGRAPH STOCK」のような「PARENTHESIZED IDEOGRAPH」文字で起きていました。

## 8.0.3リリース - 2018-05-29

### 改良

- [highlight_html] `NormalizerNFKC100` または `TokenNgram` を使って検索した結果のハイライトをサポートしました。

- [トークナイザー] `TokenNgram` に新しいオプション `report_source_location option` を追加しました。このオプションは、`highlight_html` で語彙表を使ったハイライトをする時に使用します。

- [ノーマライザー] `NormalizerNFKC100` に新しいオプション `unify_middle_dot option` を追加しました。このオプションは、中点を正規化します。`・` の有無や `・` 位置にかかわらず検索できます。

- [ノーマライザー] `NormalizerNFKC100` に新しいオプション `unify_katakana_v_sounds option` を追加しました。このオプションは、`ヴァヴィヴヴェヴォ` を `バビブベボ` へ正規化します。例えば `バイオリン` を `ヴァイオリン` で検索できます。

- [ノーマライザー] `NormalizerNFKC100` に新しいオプション `unify_katakana_bu_sound option` を追加しました。このオプションは、`ヴァヴィヴゥヴェヴォ` を `ブ` に正規化します。例えば、`セーブル` や `セーヴル` を `セーヴェル` で検索できます。

- [sub_filter] 十分にフィルターされたケースでの `sub_filter` の動作を最適化しました。この最適化は、 `sub_filter` 実行前に十分にレコードが絞り込まれているケースで有効になります。

- [groonga-httpd] 全てのワーカのコンテキストアドレスをユニークにしました。コンテキストアドレスは、以下のクエリーログの `#{ID}` です。

  #{TIME_STAMP}|#{MESSAGE}
  #{TIME_STAMP}|#{ID}|>#{QUERY}
  #{TIME_STAMP}|#{ID}|:#{ELAPSED_TIME} #{PROGRESS}
  #{TIME_STAMP}|#{ID}|<#{ELAPSED_TIME} #{RETURN_CODE}

- [delete] 新しいオプション `limit` を追加しました。以下の例のように、削除するレコードの件数を制限できます。`delete --table Users --filter '_key @^ "b"' --limit 4`

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

### 修正

- [logical_select] 動的カラムをフィルターした時にエラーが発生するとメモリリークする不具合を修正しました。
- [logical_count] 動的カラムの初期化に失敗した際にメモリリークする不具合を修正しました。
- [logical_range_filter] 動的カラムの評価に失敗した際にメモリリークする不具合を修正しました。
- [トークナイザー] `loose_symbol` のように緩いトークナイズをした時に `source_offset` が誤った値になる不具合を修正しました。
- [ノーマライザー] `U+FF21 FULLWIDTH LATIN CAPITAL LETTER A` のような全角ラテン大文字が、`U+0061 LATIN SMALL LETTER A` のようなラテン小文字に正規化されない不具合を修正しました。すでに、 `NormalizerNFKC100` を使用している場合は、インデックスを再生成する必要があります。

## 8.0.2リリース - 2018-04-29

### 改良

- [grndb][--force-truncate] `grndb recover --force-truncate` オプションを指定することで、テーブルにロックが残ったままの状態でも truncate できるようにしました。

- [logical_range_filter] `sort_keys` オプションに対応しました。

- 新しい関数 `time_format()` を追加しました。`Time` 型のカラムの値を時刻表記で出力できます。書式は `strftime` 用の形式を指定できます。

- [トークナイザー] 新しいトークナイザー `TokenNgram` を追加しました。このトークナイザーは、オプションを通じて挙動を動的に変えることができます。対応しているオプションは以下の通りです。

  > - `n` : Ngram の「N」を指定します。例えば trigram の場合は「3」です。
  > - `loose_symbol` : 記号を含む語句について、記号の有無の違いを無視して検索できるようにトークナイズします。例えば「090-1111-2222」という語句は、「09011112222」「090」「1111」「2222」「090-1111-2222」のいずれで検索した場合にも検索結果としてヒットするようになります。
  > - `loose_blank` : 空白を含む語句について、空白の有無の違いを無視して検索できるようにトークナイズします。例えば「090 1111 2222」という語句は、「09011112222」「090」「1111」「2222」「090 1111 2222」のいずれで検索した場合にも検索結果としてヒットするようになります。
  > - `remove_blank` : 空白を含む語句について、空白無しの語句で検索できるようにトークナイズします。例えば「090 1111 2222」という語句は、「09011112222」「090」「1111」「2222」のいずれで検索した場合にも検索結果としてヒットするようになります。空白を含む語句「090 1111 2222」での検索にはヒットしない点にご注意下さい。

- [ノーマライザー] Unicode 10.0 の NFKC（Normalization Form Compatibility Composition）に基づくノーマライザーである "NormalizerNFKC100" を追加しました。

- [ノーマライザー] ノーマライザーの "NormalizerNFKC51" と "NormalizerNFKC100" でのオプション指定に対応しました。ノーマライザーの挙動を動的に変えることができます。対応しているオプションは以下の通りです。

  > - `unify_kana` : 同じ音となる全角ひらがな、全角カタカナ、半角カタカナの文字を同一視します。
  > - `unify_kana_case` : 全角ひらがな、全角カタカナ、半角カタカナで拗音、促音などを表す小さな文字（例：「ぁ」「ゃ」「っ」）を大きな文字と同一視します。
  > - `unify_kana_voiced_sound_mark` : 全角ひらがな、全角カタカナ、半角カタカナで濁点や半濁点の有無を同一視します。
  > - `unify_hyphen` : ハイフンに類する文字すべてをハイフンと同一視します。
  > - `unify_prolonged_sound_mark` : 長音記号に類する文字すべてを長音記号と同一視します。
  > - `unify_hyphen_and_prolonged_sound_mark` : ハイフンに類する文字と長音記号に類する文字のすべてをハイフンと同一視します。

- [dump] トークナイザーとノーマライザーのオプションの出力に対応しました。トークナイザーまたはノーマライザーのオプションを含んだ状態でGroonga 8.0.2およびそれ以降で出力した dump は、Grooga 8.0.1以前のバージョンでは読み込めず、未対応の情報によりエラーとなります。

- [dump] トークナイザーとノーマライザーのオプションの出力に対応しました。トークナイザーまたはノーマライザーのオプションを含んだ状態でGroonga 8.0.2およびそれ以降で出力した schema は、Grooga 8.0.1以前のバージョンでは読み込めず、未対応の情報によりエラーとなります。

- Ubuntu 18.04 (Bionic Beaver)をサポートしました。

### 修正

- スペースのみの検索クエリが意図しないレコードにマッチする不具合を修正しました。[groonga-dev,04609][satouyuzhさんの報告]
- 誤ったスコアラーが使われる場合があった不具合を修正しました。この問題は以下のように複数のスコアラーが使われた時に発生していました： `--match_columns 'title || scorer_tf_at_most(content, 2.0)'`
- 「thread_limit」の変更に時間がかかりすぎる問題を修正しました。

### 感謝

- satouyuzhさん

## 8.0.1リリース - 2018-03-29

### 改良

- [ログ] クエリーログ内で `filter` 条件を表示するようにしました。この機能はデフォルトでは、無効になっています。有効にするためには、環境変数 `GRN_QUERY_LOG_SHOW_CONDITION=yes` を設定します。

- `*.pdb` を `*.dll` と `*.exe` と同じディレクトリにインストールされるようにしました。

- [logical_count] `filtered` ステージの動的カラムをサポートしました。

- [logical_count] [post_filter] フィルタータイミングを新規追加しました。 `filtered` ステージのカラムが生成された後に実行されます。

- [logical_select] [post_filter] フィルタータイミングを新規追加しました。 `filtered` ステージのカラムが生成された後に実行されます。

- ベクターデータに対してLZ4/Zstd/zlibの圧縮をサポートしました。

- `_key` のようなアクセサへのエイリアスをサポートしました。

- [logical_range_filter] 大きい結果セットに対するウィンドウ関数の動作を最適化しました。一致するレコードが十分見つかった場合は、残りのウィンドウに対してウィンドウ関数を適用しません。

  TODO: この最適化は、最適化によるオーバーヘッドが無視出来ない場合、小さな結果セットに対しては、無効になります。 オーバーヘッドがどのくらいになるのかは、まだ評価出来ていません。

- [select] `match_escalation` パラメーターを追加しました。`--match_escalation yes` とすることによって、マッチ演算のエスカレーションを強制的に有効にします。このパラメータは、 `--match_escalation_threshold 99999....999` よりも強力です。`match_escalation yes` は、 `SOME_CONDITIONS && column @ 'query'` もエスカレーションしますが、 `--match_escalation_threshold` ではしないためです。

  デフォルトは、 `--match_escalation auto` です。これは、既存の動作と同じです。

  `--match_escalation no` とすることで、マッチ演算のエスカレーションを無効にできます。これは、 `--match_escalation_threshold -1` と同様の動きになります。

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

### 修正

- 共通接頭辞がどのトークンにもマッチしない時にメモリリークする問題を修正しました。[GitHub#820] [村上さんがパッチ提供]
- 同一プロセスで複数のデータベースを開いている時に、異なるデータベースのキャッシュを使用してしまう問題を修正しました。
- 誤ったインデックスが構築される問題を修正しました。この問題は、インデックスカラムのソースがベクターカラムでかつ、 `WITH_SECTION` を指定していない時だけ発生します。
- 比較時(>,>=,<,<=,==,!=)に定数がオーバーフローまたは、アンダーフローし得る問題を修正しました。

### 感謝

- 村上さん

## 8.0.0リリース - 2018-02-09

メジャーバージョンアップです! メジャーバージョンアップですが、互換性は壊れていないので、データベースを再構築することなくアップグレードできます。

### 改良

- [select] `--drilldown_adjuster` と `drilldowns[LABEL].adjuster` を追加しました。drilldown結果に対して、スコア調整できるようになります。

- [動的なインデックス構築方法] 環境変数の名前を `GRN_II_REDUCE_EXPIRE_ENABLE` から `GRN_II_REDUCE_EXPIRE_THRESHOLD` へ変更しました。

  `GRN_II_REDUCE_EXPIRE_THRESHOLD=0 == GRN_II_REDUCE_EXPIRE_ENABLE=no` 。 `GRN_II_REDUCE_EXPIRE_THRESHOLD=-1` とすると、しきい値は `ii->chunk->max_map_seg / 2` となります。`GRN_II_REDUCE_EXPIRE_THRESHOLD > 0` とすると、しきい値は `MIN(ii->chunk->max_map_seg / 2, GRN_II_REDUCE_EXPIRE_THRESHOLD)` となります。デフォルト値は、 `GRN_II_REDUCE_EXPIRE_THRESHOLD=32` です。

- [between] 境界値なしの `between()` を受け付けるようにしました。`between()` の引数の数が3つでも実行できます。2番目と3番目の引数が境界を含むものとして処理されます。

### 修正

- ハッシュテーブルのメモリリークを修正しました。 [GitHub:mroonga/mroonga#190][fuku1さんの報告]
- 配列のメモリリークを修正しました。
- [select] `output_columns` で結果の変化する関数を使っている時にキャッシュしないようにしました。
- [Windows] `WSASend` が適切なエラーコードを返すようにしました。

### 感謝

- fuku1さん

## 7.1.1リリース - 2018-01-29

### 改良

- [Ubuntu] Ubuntu 17.04（Zesty Zapus）のサポートをやめました。2018年1月13日でサポートが切れた（EOLになった）ためです。

- Quorum matchをサポートしました。スクリプト構文でもクエリー構文でもquorum matchを使うことができます。

  TODO: quorum matchの構文をドキュメントへ追加、それらのドキュメントへのリンク生成

- スクリプト構文で類似度のカスタマイズをサポートしました。スクリプト構文内で類似度のカスタマイズができます。

  TODO: 類似度のカスタマイズの構文をドキュメントへ追加、それらのドキュメントへのリンク生成

- [grndb][--force-lock-clear] `--force-lock-clear` を追加しました。このオプションは、データベースやテーブル、データカラムのロックを強制的に解除します。データベースやテーブル、データカラムにロックが残っていても再度データベースを使えるようになります。

  しかし、このオプションはとても危険です。通常は使うべきではありません。データベースが壊れている場合は、データベースは依然として破損しています。このオプションはロックを無視するだけです。

- [load] サロゲートペアをエスケープ可能にしました。例えば、 `\uD83C\uDF7A` は `🍺` として処理されます。

- [Windows] Windows上でスパースファイルを使用するように変更しました。ディスク容量を節約できます。パフォーマンス上のデメリットはありません。

- [動的なインデックス構築方法] インデックスカラム内のメモリーマップをいつ開放するかをコントロールする環境変数 `GRN_II_REDUCE_EXPIRE_THRESHOLD` を追加しました。デフォルトは `-1` です。 `-1` のときはインデックスカラムのサイズによって動的に開放するタイミングを決めます。インデックスカラムが小さければ頻繁に解放し、大きければ頻度を下げます。

  `0` を設定すると従来と同じ挙動になります。従来の挙動とは、Groongaは開放できそうなときはいつも開放しようとするという挙動です。

- [logical_range_filter] [post_filter]フィルタータイミングを新規追加しました。 `filtered` ステージで生成されるカラムが生成された後に実行されます。

### 修正

- 参照ベクタのインデックスを作成する際に使用するリソースを削減しました。[GitHub#806][村上さんが報告]
- [table_create] `token_filters` が無効であってもテーブルが作成される不具合を修正しました。

### 感謝

- 付超群さん
- 村上さん

## 7.1.0リリース - 2017-12-29

### 改良

- [load] `load` コマンドのクエリーログのフォーマットを改良しました。`load` コマンドのクエリーログに以下の項目が追加されます。

  > - ロードしたレコード数を表示します。
  > - ロードがエラーになったレコードとカラムの数を表示します。
  > - ロード後の総レコード数を表示します。

- [logical_count] `logical_count` コマンドのクエリーログのフォーマットを改良しました。`logical_count` コマンドのクエリーログに以下の項目が追加されます。

  > - マッチしたレコード数を表示します。

- [logical_select] `logical_select` コマンドのクエリーログのフォーマットを改良しました。 `logical_select` コマンドのクエリーログに以下の項目が追加されます。

  > - マッチしたレコード数を表示します。
  > - ドリルダウンした数を表示します。
  > - ラベルつきのドリルダウンをした数を表示します。
  > - それぞれのシャードで検索にマッチした数を表示します。
  > - 検索対象のシャードの情報を"[...]"を使って表示します。

- [delete] `delete` コマンドのクエリーログのフォーマットを改良しました。 `delete` コマンドのクエリーログに以下の項目が追加されます。

  > - 削除したレコード数と削除に失敗したレコード数を表示します。
  > - 削除後に残ったレコード数を表示します。

- [Groonga HTTPサーバー] `groonga -s` で実行したサーバーをC-c で確実に停止出来るようにしました。

- Lisp表現( `#<nan>` 、 `#i1/0` 、 `#-i1/0` )の代わりに `Nan` と `Infinity` 、 `-Infinity` を使用するように改良しました。

- ドリルダウンでベクター型のカラムをサポートしました。

- 部分的に正規表現を用いた検索から、キーワードを抽出出来るように改良しました。これにより、正規表現を用いた検索に `highlight_html` と `snippet_html` を使えるようになります。[takagi01さんに報告いただきました]

- `grn_bulk_*()` APIにおいて、 `realloc()` が呼ばれる回数を削減しました。

  Windowsにおいて出力が大きいケースでパフォーマンスが向上します。例えば、出力が100MBを超える場合には、約100倍速くなります。

  `realloc()` はWindowsでは重い処理であるためです。

- `GRN_II_OVERLAP_TOKEN_SKIP_ENABLE` の値にyesが設定された時のみ `GRN_II_OVERLAP_TOKEN_SKIP_ENABLE` を有効にするようにしました。

- `GRN_NGRAM_TOKENIZER_REMOVE_BLANK_DISABLE` は非推奨になりました。代わりに `GRN_NGRAM_TOKENIZER_REMOVE_BLANK_ENABL=no` を使って下さい。

- 関数 `index_column_source_records` を新規に追加しました。インデックスカラムのソースを取得することができます。[村上さんがパッチを提供]

- [select] offsetに負の値を設定出来るようにしました。

- 固定サイズのカラムの値を取得する際のパフォーマンスを向上しました。

- [groonga 実行ファイル] groongaコマンドの引数に `--listen-backlog` オプションを追加しました。listenシステムコールのbacklogをカスタマイズできます。

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

### 修正

- `highlight_full` 関数を使用するとメモリリークする問題を修正しました。

- Mroongaで以下ような呼び出しを行った際にクラッシュする問題を修正しました。

  > 1. `grn_expr_append_const("_id")`
  > 2. `grn_expr_append_op(GRN_OP_GET_VALUE)`

### 感謝

- takagi01
- 村上さん

## 7.0.9リリース - 2017-11-29

### 改良

- Apache Arrowの新しいバージョンをサポートしました。このリリースでは、Apache Arrowサポートを有効にするには0.8.0以降が必要です。
- [sharding] 動的カラムの新しいAPIを追加しました。
  - Groonga::LabeledArguments
- [sharding] 便利メソッドである `Table#select_all` を追加しました。
- [logical_range_filter] 動的カラムをサポートしました。 `initial` と `filtered` ステージのみをサポートしています。
- [logical_range_filter] `cache` 引数と動的カラムに関するドキュメントを追加しました。
- [logical_count] 動的カラムをサポートしました。`initial` ステージのみサポートしています。
- [logical_count] 名前付き引数のドキュメントを追加しました。
- [select] `--match_columns _key` をインデックスを使わない場合でもサポートしました。
- [in_values] 126を超える引数を指定できるようにしました。 [GitHub#760] [GitHub#781] [groonga-dev,04449] [むらたさんが報告]
- [httpd] バンドルしているnginxのバージョンを1.13.7に更新しました。

### 修正

- [httpd] 古いバージョンのGroongaがすでにインストールされている場合にそちらを参照してしまい、ビルドエラーになる問題を修正しました。　[GitHub#775] [myamanishi3さんが報告]
- [in_values] `in_values` に多すぎる引数を指定するとクラッシュする不具合を修正しました。この不具合は126を超える引数をサポートする過程で見つかりました。 [GitHub#780]
- [cmake] LZ4 と MessagePack をビルド時に正しく検出できるようにしました。 [Sergei Golubchikさんが報告]
- [静的なインデックス構築方法] ベクターカラムの静的索引構築時に必要以上のリソースを使用する問題を修正しました。1つのベクターカラムの要素数が多く、大量のレコードがある場合はGroongaがクラッシュしていました。 [groonga-dev,04533][内山敏郎さんが報告]

### 感謝

- むらたさん
- myamanishi3さん
- Sergei Golubchikさん
- 内山敏郎さん

## 7.0.8リリース - 2017-10-29

### 改良

- [windows] クラッシュした際にバックトレースを出せるようにしました。関数呼び出しだけでなく、ソースコードの該当行も可能な限り表示します。バックトレースのサポートにより、問題の素早い解決につながります。
- `QUERY_NO_SYNTAX_ERROR` を指定してあれば "( )" を `--query` に指定して実行できるようにしました。 以前のバージョンでは、エラーになっていました。 [GitHub#767]
- `QUERY_NO_SYNTAX_ERROR` を指定してあれば "(+)" を `--query` に指定して実行できるようにしました。 以前のバージョンでは、エラーになっていました。 [GitHub#767]
- `QUERY_NO_SYNTAX_ERROR` を指定してあれば `--query "~y"` (~ではじまる)クエリーを実行できるようにしました。 以前のバージョンでは、エラーになっていました。 [GitHub#767]
- `expired` のログレベルを `info` から `debug` に変更しました。 `2017-10-29 14:05:34.123456|i| <0000000012345678:0> expired i=000000000B123456 max=10 (2/2)` このメッセージはインデックスをメモリーにマップした後で開放されたときに記録されます。つまり、メモリーの使用状況に関するデバッグには有用ですが、通常の運用においては有用ではありません。そのためログレベルを `debug` に変更しました。
- Ubuntu 17.10 Artful Aardvarkをサポート。

### 修正

- [dat] データベースを拡張する際、意図せず大きなファイルが(ワーストケースで)作成されてしまうことのある不具合を修正しました。この不具合はインデックスカラムを頻繁に作成/削除を繰り返したときに発生する可能性があります。7.0.7ではこの不具合に関連して"大量にキーを削除したケースで `table_create` に失敗する"問題を修正しましたが、その修正が不十分なケースに対応しました。
- [logical_select] `offset` と `limit` が複数のシャードに対して適用されたとき、実際よりも少ないレコードが返される不具合を修正しました。

## 7.0.7リリース - 2017-09-29

### 改良

- `QUERY_NO_SYNTAX_ERROR` を `+` のみのクエリーに指定したときにも動作するようにしました。以前のバージョンではそのようなクエリーはエラーになっていました。

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

- [dump] 引数のデフォルト値を構文のセクションに追加しました。

- [コマンドバージョン] `--default-command-version 3` に対応しました。

- 関数呼び出し時に検索結果をキャッシュできるようにしました。ほとんどの関数の呼び出し結果はキャッシュされます。例外は `now()` と `rand()` を使った場合です。標準でキャッシュするように振る舞いを変更したので、新たにAPIを追加しました。

  - `grn_proc_set_is_stable()` を追加。
  - `grn_proc_is_stable()` を追加。

  呼び出しごとに結果が異なる関数を新規に追加する場合、`grn_proc_is_stable(ctx, proc, GRN_FALSE)` を呼ばなければなりません。もし呼ばなかった場合には、検索結果がキャッシュされるので、期待と異なり誤った結果を返します。

### 修正

- [windows] `database_unmap` が実行される前のファイルハンドルのエラー処理を適切に行うようにしました。`database_unmap` 実行前にリクエストがキャンセルされた場合、排他制御部分が未初期化となる場合がありました。その場合、クラッシュしていました。

- [トークナイザー] トークナイザー名のドキュメントを修正しました。`TokenBigramIgnoreBlankSplitSymbolAlpha` や `TokenBigramIgnoreBlankSplitSymbolAlphaDigit` であるべきでした。

- エラー時に空のファイルが残らないようにしました。

  以前のバージョンでは、空のファイルがエラー時に残っていました。

  再現するためのシナリオは以下です。:

  > 1. `grn_fileinfo_open` によりファイルの作成に成功する
  > 2. `DO_MAP` によりファイルマッピングに失敗する

  そのような場合、Groongaの管理下にないファイルのせいで「すでにファイルが存在します。」という別のエラーが発生します。そういったファイルは後始末の段階で削除すべきでした。

- 短時間に多数の更新を行っている状況で検索した場合にクラッシュすることがある不具合を修正しました。

- [table_create] 大量に削除されたキーがDATテーブルに存在する場合、`table_create` の実行に失敗する不具合を修正しました。

## 7.0.6リリース - 2017-08-29

### 改良

- 前方一致検索を複数インデックスを指定してできるようになりました。 (例 `--query "Foo*" --match_columns "TITLE_INDEX_COLUMN||BODY_INDEX_COLUMN"`)
- [window_count] `window_count` 関数を追加しました。検索した結果にカウントした値を追加するのに使います。検索結果をもとに分析したり、カウント結果をもとにフィルタしたりすると便利です。
- 以下のAPIを公開しました。
  - `grn_obj_get_disk_usage()` を追加。
  - `GRN_EXPR_QUERY_NO_SYNTAX_ERROR` を追加。
  - `grn_expr_syntax_expand_query_by_table()` を追加。
  - `grn_table_find_reference_object()` を追加。
- [object_inspect] 指定したオブジェクトのディスク使用量を表示できるようになりました。
- クエリーをパースする際にフォールバックする機能をサポートしました。 `QUERY_NO_SYNTAX_ERROR` フラグが `query_flags` に指定されていると有効になります。(標準では無効です) このフラグが設定されていると、シンタックスエラーが発生しなくなります。例えば、"A +" というクエリーは自動的にエスケープされて "A +" という扱いになります。この振る舞いはアプリケーションがユーザーの入力をそのまま検索語句として使い、シンタックスエラーやログに記録されないようにしたい場合に便利です。
- クエリー内の語のスコアを調整できるようになりました。">", "<" と "~"がサポートされています。例えば ">Groonga" は "Groonga" のスコアをインクリメントします。"<Groonga" は "Groonga" のスコアをデクリメントします。"~Groonga" は検索結果についてマッチしたドキュメントのスコアをデクリメントします。"~" は検索結果そのものには影響しません。
- テーブルを削除するときのパフォーマンスを改善しました。 `thread_limit=1` する必要はありません。参照されているテーブルが存在するかチェックする処理をオブジェクトを開かなくてもできるようにしました。その結果としてパフォーマンスが改善しました。
- [httpd] バンドルしているnginxのバージョンを1.13.4に更新しました。

### 修正

- [dump] 7番目の引数 ( `--sort_hash_table` )が名前無しだと無視される不具合を修正しました。
- [schema] コマンドラインパラメータの誤りを修正しました。source であるべきところが sources になっていました。[groonga-dev,04449] [むらたさんが報告]
- [ruby_eval] ruby_evalコマンドがシンタックスエラーのときにクラッシュする問題を修正しました。 [GitHub#751] [ryo-pinusさんがパッチ提供]

### 感謝

- murata satoshi
- ryo-pinus

## 7.0.5リリース - 2017-07-29

### 改良

- [httpd] バンドルしているnginxのバージョンを1.13.3に更新しました。セキュリティーに関する修正(CVE-2017-7529)を含んでいます。
- [load] UInt64の最大値をロードできるようにしました。以前のバージョンでは意図せず0に変換されてしまっていました。
- 以下のAPIを公開しました。
  - `grn_window_get_size()` [GitHub#725] [村上さんがパッチ提供]
- [math_abs] 絶対値を計算するための `math_abs()` 関数を追加しました。 [GitHub#721]
- `grn_default_logger_set_path()` と `grn_default_query_logger_set_path()` をスレッドセーフにしました。
- [Windows] バンドルしているpcreを8.41に更新しました。
- [normalize] エラー時に冗長な空文字列が出力されないようにしました。
- [functions/time] 0除算が発生したときにエラーメッセージを出力するようにしました。 [GitHub#733] [村上さんがパッチ提供]
- [windows] `ERROR_NO_SYSTEM_RESOURCES` エラーを `GRN_RESOURCE_TEMPORARILY_UNAVAILABLE` にマッピングするようにしました。以前は `rc=-1` をエラーコードとして返していました。ただし実際にどんな問題がおきたのかこれではわかりにくいので、 今回の修正では `rc=-12` を返すようにしています。
- [functions/min][functions/max] ベクターカラムをサポートしました。これでカラムがスカラーなのかベクターなのか気にせず使えるようになりました。 [GitHub#735] [村上さんがパッチ提供]
- [dump] `--sort_hash_table` オプションをサポートしました。ハッシュテーブルの `_key` でのソートには `--sort_hash_table yes` を指定します。
- [between] インデックスカラムを指定できるようになりました。 [GitHub#740] [村上さんがパッチ提供]
- [load] Apache Arrow 0.5.0 以降をサポート。
- [エラーメッセージの解析方法] エラーメッセージの解析方法のドキュメントを追加しました。
- [Debian GNU/Linux] ソースからビルドするときに必要なパッケージのリストを更新しました。
- [Ubuntu] Ubuntu 16.10（Yakkety Yak）のサポートをやめました。2017年7月20日でサポートが切れた（EOLになった）ためです。

### 修正

- テキスト型( `ShortText` など)のベクターカラムに対するインデックスを正しく構築できるようにしました。この修正でインデックス更新後に全文検索でマッチしない問題が解決します。 [GitHub#494]
- [thread_limit] `thread_limit?max=1` というリクエストが同時にきたときにデッドロックが発生する問題を修正しました。
- [groonga-httpd] デフォルトのPIDのパスと再起動時に想定しているPIDのパスがあっていない問題を修正しました。そのせいで groonga-httpd の再起動に失敗していました。 [GitHub#743] [sozakiさんが報告]

### 感謝

- 村上さん

## 7.0.4リリース - 2017-06-29

### 改良

- 物理的なファイルの作成/削除のログを障害の切り分けのために記録するようにしました。 [GitHub#700,#701]
- [in_records] 固定長カラムの検索パフォーマンスを改善しました。速度が50%程度改善する可能性があります。
- [grndb] `--log-path` オプションを追加しました。
- [grndb] `--log-level` オプションを追加しました。
- 以下のAPIを公開しました。
  - `grn_operator_to_exec_func()`
  - `grn_obj_is_corrupt()`
- "固定長カラム 演算子 定数" というようなクエリのパフォーマンスを改善しました。対応している演算子は `==`, `!=`, `<`, `>`, `<=` と `>=` です。
- "カラム 演算子 値 && カラム 演算子 値 && ..." というようなクエリのパフォーマンスを改善しました。
- [grndb] `grndb check` で壊れたオブジェクトの検出をサポートしました。
- [io_flush] `--only_opened` オプションをサポートしました。開いているデータベースオブジェクトのみをフラッシュすることができます。
- [grndb] 参照先のない "inspect" オブジェクトの検出と削除をサポートしました。この状態はコマンド名が `inspect` から `object_inspect` に変更されたことによって発生していました。

### 修正

- [rpm][centos] カスタマイズ版のビルドで意図しないマクロ展開が発生する問題を修正しました。この不具合はGroongaをSRPMからビルドする際にspecファイルの `additional_configure_options` パラメータを使ってリビルドするときのみ発生していました。
- `grn_table_setoperation()` のNULLチェックを追加しました。インデックスが壊れている際に、クラッシュする可能性がありました。 [GitHub#699]

### 感謝

## 7.0.3リリース - 2017-05-29

### 改良

- [select] インデックス名を指定した全文検索 のドキュメントを追加しました。
- [インデックス] どのレコードに対するポスティングリストが長すぎるのかわかるように、警告メッセージをログに出すようにしました。
- [load][dump] Apache Arrowをサポートするようにしました。 [GitHub#691]
- [cmake] 静的ライブラリとしてビルドする際に、LZ4をリンクできるようにしました。 [Sergei Golubchikさんがパッチを提供]
- [delete] キャンセルできるようにしました。
- [httpd] バンドルしているnginxのバージョンを1.13.0に更新しました。
- 以下のAPIを公開しました。
  - `grn_plugin_proc_get_caller()` を追加。
- インデックスカラムに関連した関数とセレクタを追加しました。
  - 追加されたセレクタ: `index_column_df_ratio_between()`
  - 追加された関数: `index_column_df_ratio()`

### 修正

- [delete] エラーが適切にクリアされていない不具合を修正しました。そのせいで、後続の削除処理に影響し意図しない振る舞いをしていました。
- [windows] ファイルを `O_CREAT` フラグ付きで開くときに、IOのバージョンが正しく検出されない不具合を修正しました。
- [vector_slice] (型のサイズが)4バイトでないベクターカラムをsliceできない不具合を修正しました。 [GitHub#695] [村上さんがパッチ提供]
- (型のサイズが)4バイトでないベクターカラムでベクターの要素をインデックスで指定するとシーケンシャルサーチでマッチしない不具合を修正しました。 [GitHub#696] [村上さんがパッチ提供]
- [logical_select] `min` に月の最終日を指定すると "argument out of range" が発生する不具合を修正しました。

### 感謝

- Sergei Golubchikさん
- 村上さん

## 7.0.2リリース - 2017-04-29

### 改良

- [logical_select] drilldowns[${LABEL}].columns[${NAME}].window.sort_keys と drilldowns[${LABEL}].columns[${NAME}].window.group_keys で複数のキーを指定できるようになりました。
- [Windows] バンドルしているLZ4を1.7.5に更新しました。
- [cache] 永続化キャッシュをサポートしました。
- [log_level] 英語のドキュメントを更新しました。
- 以下のAPIを公開しました。
  - `grn_set_default_cache_base_path()`
  - `grn_get_default_cache_base_path()`
  - `grn_persistent_cache_open()`
  - `grn_cache_default_open()`
- [`groonga --cache-base-path`] 永続キャッシュを使うための新しいオプションを追加しました。
- [groonga-httpd] [groonga_cache_base_path] 永続キャッシュを使うための新しい設定を追加しました。
- [Windows] バンドルしているmsgpackを2.1.1に更新しました。
- [object_inspect] カラム情報を表示するだけでなく、インデックスカラムの統計情報も表示できるようにしました。
- 正規表現の「 `.*` 」というパターンでインデックスを使って検索できるようになりました。 この機能はデフォルトで有効です。環境変数に `GRN_SCAN_INFO_REGEXP_DOT_ASTERISK_ENABLE=no` を設定すると無効化できます。
- [in_records] 既存のテーブルを条件のパターンを指定するのに使うことのできる関数を追加しました。
- [Ubuntu] EOLのため、Ubuntu 12.04のサポートをやめました。

### 修正

- [logical_select] 異なるキャッシュが使われてしまう不具合を修正しました。この問題は動的カラムを使っているときに発生していました。
- [logical_select] 動的カラムが作成されない不具合を修正しました。レコードにマッチしない場合に発生していました。
- [reindex] reindexコマンドの実行によりデータが失われてしまう不具合を修正しました。
- [httpd] 別のユーザーでワーカーを動かしている時、 quit と shutdown のレスポンスが壊れている問題を修正しました。 [GitHub ranguba/groonga-client#12]

## 7.0.1リリース - 2017-03-29

### 改良

- 以下のAPIを公開しました。
  - grn_ii_cursor_next_pos()
  - grn_table_apply_expr()
  - grn_obj_is_data_column()
  - grn_obj_is_expr()
  - grn_obj_is_scalar_column()
- [column_copy] 参照型のベクタのダンプをサポートしました。
- [load] `array<object>` スタイルの重み付きベクターカラムのloadをサポートしました。 `array<object>` の例: `[{"key1": weight1}, {"key2": weight2}]`
- インデックスを使った `!(XXX OPERATOR VALUE)` の検索をサポートしました。演算子として `>` だけでなく、 `>=`、 `<`、 `<=`、 `==` や `!=` も使えます。
- インデックスを使って `!(column == CONSTANT)` を検索できるようになりました。例えば `!(column == 29)` などです。
- `!` の最適化を以下のパターンでサポートしました。
  - `!(column @ "X") && (column @ "Y")`
  - `(column @ "Y") && !(column @ "X")`
  - `(column @ "Y") &! !(column @ "X")`
- `XXX || !(column @ "xxx")` をインデックスを使って検索できるようになりました。
- [dump] `'{"x": 1, "y": 2}'` というスタイルを参照されていない重み付きベクターカラムで使うようにしました。この変更は古いGroongaには影響しません。もともとサポートされているからです。
- [実験的] `GRN_ORDER_BY_ESTIMATED_SIZE_ENABLE` 環境変数をサポートしました。この変数はクエリの最適化を予想されるヒット件数に応じて行うかどうかを切り替えるのに使用します。この機能はデフォルトでは無効です。有効にするには `GRN_ORDER_BY_ESTIMATED_SIZE_ENABLE=yes` を指定します。
- [select] `columns` や `drilldown` の評価結果をクエリログに追加するようにしました。
- [select] `drilldown` のクエリログのフォーマットを変更しました。これは非互換な変更ですが、クエリログを変換するようなプログラムを独自に開発しているユーザー以外には影響ありません。
- [table_remove] 一時的なメモリ使用量を削減しました。スレッドの最大数が0のときに有効になります。
- [select] `columns[LABEL](N)` がクエリログのフォーマットとして使われます。以前は `columns(N)[LABEL]` でした。
- [クエリ拡張] ベクターカラムを使った推奨例に更新しました。[ぐるなびさんが報告]
- ロック中にリクエストがキャンセルされたことを検出できるようにしました。これは `request_cancel` がロック中に意図せず無視されないようにします。
- [logical_select] `initial` および `filtered` 動的カラムをサポートしました。使用例は `--columns[LABEL].stage initial` や `--columns[LABEL].stage filtered` です。
- [logical_select] `match_columns` や `query` 、 `drilldown_filter` オプションをサポートしました。
- [highlight_html] 類似文書検索をサポートしました。
- [logical_select] `initial` および `filtered` 動的カラムをサポートしました。使用例は `--columns[LABEL].stage initial` や `--columns[LABEL].stage filtered` です。
- [logical_select] 動的カラムでウィンドウ関数をサポートしました。
- [select] 動的カラムに関するドキュメントを追加しました。
- [ウィンドウ関数] ウィンドウ関数のセクションをドキュメントに追加しました。
- [CentOS] EOLのため、CentOS 5のサポートをやめました。
- [httpd] バンドルしているnginxのバージョンを1.11.12に更新しました。
- ANDでのマッチ最適化を環境変数で無効化できるようにしました。この機能は `GRN_TABLE_SELECT_AND_MIN_SKIP_ENABLE=no` を設定することで無効化できます。デフォルトでは有効になっています。
- [vector_new] 新規ベクターを作成するための関数を追加しました。
- [select] `drilldown_filter` のドキュメントを追加しました。

### 修正

- [lock_clear] テンポラリデータベースに対して実行するとクラッシュする不具合を修正しました。
- 自然言語に対する動的インデックス更新でインデックスサイズが肥大化する問題を修正しました。Groonga 6.1.4から発生していました。
- [select] "A && B.C @ X" というクエリでマッチすべきレコードを返さないことがある不具合を修正しました。
- `grn_io_flush()` と `grn_io_expire()` がコンフリクトする問題を修正しました。この修正がないと、 `io_flush` と `load` が同時に特定のタイミングで実行されるとクラッシュする不具合がありました。
- [logical_table_remove] 最大スレッド数が1のときにクラッシュする不具合を修正しました。

### 感謝

- 株式会社ぐるなびさん

## 7.0.0リリース - 2017-02-09

### 改良

- [in_values] 参照型ベクターカラムのシーケンシャルサーチに対応しました。 [GitHub#629] [村上さんがパッチ提供]
- [select] 誤った `drilldown[LABEL].sort_keys` が指定されたとき、無視するのではなく、エラーを報告するようにしました。
- [select] DBのメタデータを不必要に更新しないようにしました。 `select` コマンドを使っているだけなのにDBにロックがかかったままになってしまうのを防ぎます。
- [lock_clear] `lock_clear` でDBのメタデータに対するロックも削除できるようにしました。
- [CentOS] GroongaをAmazon LinuxでもインストールできるようにEPELをデフォルトで有効にするようにしました。
- [query] `default_mode` オプションで "@X" スタイルのエイリアスが使えるようになりました。
- [query] 動作モードのリストに関するドキュメントを更新しました。動作モードの既定値は `MATCH` ("@") で全文検索を実行します。
- [rpm][centos] CentOS 7で groonga-token-filter-stem パッケージを提供するようにしました。 ステミングに対応するための `TokenFilterStem` トークンフィルターを提供します。　[GitHub#633] [Tim Bellefleurさんが報告]
- [window_record_number] `record_number` が非推奨になりました。代わりに `window_record_number` を使ってください。 `record_number` は互換性のためだけに残っています。
- [window_sum] `window_sum` ウィンドウ関数を追加しました。PostgreSQLのsum()と同様のウィンドウ関数を提供します。
- `TABLE_DAT_KEY` テーブルをインメモリで使ったときに静的インデックス構築をできるようにしました。 [GitHub#623] [村上さんが報告]
- バンドルしている鬼雲を6.1.1へと更新しました。
- `columns[LABEL].window.group_keys` をサポートしました。ウィンドウ関数をグループごとに提供することができます。
- [load] 誤ったキーが指定されていたときにエラーを報告するようにしました。キーの型が異なっている場合でも気付けるようになります。
- [load] `--output_errors yes` オプションをサポートしました。"yes"を指定すると、どのレコードのloadに失敗したのかエラーを取得できるようになります。この機能を使う場合には、コマンドバージョン3を指定します。
- [load] キーのキャストに失敗したときのエラーメッセージをわかりやすくしました。以前は単に "cast failed" と表示していましたが、テーブルのキーの型とキャスト対象となるキーの型もメッセージに含まれるようになりました。
- [httpd] バンドルしているnginxのバージョンを1.11.9に更新しました。

### 修正

- 存在しないソートキーを `drilldowns[LABEL]` や `slices[LABEL]` に指定するとJSONパースエラーとなる不具合を修正しました。 [GitHub#627] [村上さんがパッチ提供]
- 存在しないグループのサブレコードにアクセスしようとするとクラッシュする不具合を修正しました。例えば、 `drilldowns[LABEL].sort_keys _sum` を `calc_types` の指定なしに使っていた場合に問題が発生していました。 [GitHub#625] [村上さんがパッチ提供]
- tokenizerでエラーが発生するとクラッシュする不具合を修正しました。tokenizer と token filterを登録していて、tokenizer にエラーがあると発生していました。
- [window_record_number] ウィンドウ関数の引数が正しく渡されていない不具合を修正しました。 [GitHub#634] [村上さんがパッチ提供]

### 感謝

- 村上さん
- aomi-nさん

## 古いリリース

- News - 6.x
  - 6.1.5リリース - 2017-01-23
  - 6.1.4リリース - 2017-01-18
  - 6.1.3リリース - 2017-01-06
  - 6.1.2リリース - 2016-12-31
  - 6.1.1リリース - 2016-11-29
  - 6.1.0リリース - 2016-10-29
  - 6.0.9リリース - 2016-09-29
  - 6.0.8リリース - 2016-08-29
  - 6.0.7リリース - 2016-07-29
  - 6.0.5リリース - 2016-06-29
  - 6.0.4リリース - 2016-06-06
  - 6.0.3リリース - 2016-05-29
  - 6.0.2リリース - 2016-04-29
  - 6.0.1リリース - 2016-03-29
  - 6.0.0リリース - 2016-02-29
- News - 5.x
  - 5.1.2リリース - 2016-01-29
  - 5.1.1リリース - 2015-12-29
  - 5.1.0リリース - 2015-11-29
  - 5.0.9リリース - 2015-10-29
  - 5.0.8リリース - 2015-09-29
  - 5.0.7リリース - 2015-08-31
  - 5.0.6リリース - 2015-07-29
  - 5.0.5リリース - 2015-06-29
  - 5.0.4リリース - 2015-05-29
  - 5.0.3リリース - 2015-04-29
  - 5.0.2リリース - 2015-03-31
  - 5.0.1リリース - 2015-03-29
  - 5.0.0リリース - 2015-02-09
- News - 4.x
  - 4.1.1リリース - 2015-01-29
  - 4.1.0リリース - 2015-01-09
  - 4.0.9リリース - 2014-12-29
  - 4.0.8リリース - 2014-11-29
  - 4.0.7リリース - 2014-10-29
  - 4.0.6リリース - 2014-09-29
  - 4.0.5リリース - 2014-08-29
  - 4.0.4リリース - 2014-07-29
  - 4.0.3リリース - 2014-06-29
  - 4.0.2リリース - 2014-05-29
  - 4.0.1リリース - 2014-03-29
  - 4.0.0リリース - 2014-02-09
- News - 3.x
  - 3.1.2リリース - 2014-01-29
  - 3.1.1リリース - 2013-12-29
  - 3.1.0リリース - 2013-11-29
  - 3.0.9リリース - 2013-10-29
  - 3.0.8リリース - 2013-09-29
  - 3.0.7リリース - 2013-08-29
  - 3.0.6リリース - 2013-07-29
  - 3.0.5リリース - 2013-06-29
  - 3.0.4リリース - 2013-05-29
  - 3.0.3リリース - 2013-04-29
  - 3.0.2リリース - 2013-03-29
  - 3.0.1リリース - 2013-02-28
  - 3.0.0リリース - 2013-02-09
- News - 2.x
  - 2.1.2リリース - 2013-01-29
  - 2.1.1リリース - 2012-12-29
  - 2.1.0リリース - 2012-12-29
  - 2.0.9リリース - 2012-11-29
  - 2.0.8リリース - 2012-10-29
  - 2.0.7リリース - 2012-09-29
  - 2.0.6リリース - 2012-08-29
  - 2.0.5リリース - 2012-07-29
  - 2.0.4リリース - 2012-06-29
  - 2.0.3リリース - 2012-05-29
  - 2.0.2リリース - 2012-04-29
  - 2.0.1リリース - 2012-03-29
  - 2.0.0リリース - 2012-02-29
- News - 1.3.x
  - 1.3.0リリース - 2012-01-29
- News - 1.2.x
  - 1.2.9リリース - 2011-12-29
  - 1.2.8リリース - 2011-11-29
  - 1.2.7リリース - 2011-10-29
  - 1.2.6リリース - 2011-09-29
  - 1.2.5リリース - 2011-08-29
  - 1.2.4リリース - 2011-07-29
  - 1.2.3リリース - 2011-06-29
  - 1.2.2リリース - 2011-05-29
  - 1.2.1リリース - 2011-04-29
  - 1.2.0リリース - 2011-03-29
- バージョン1.1.xのお知らせ
  - 1.1.0リリース - 2011-02-09
- バージョン1.0.xのお知らせ
  - 1.0.8リリース - 2011-02-02
  - 1.0.7リリース - 2011-01-29
  - 1.0.6リリース - 2010-12-31
  - 1.0.5リリース - 2010-12-29
  - 1.0.4リリース - 2010-11-29
  - 1.0.3リリース - 2010-10-29
  - 1.0.2リリース - 2010-09-09
  - 1.0.1リリース - 2010-09-06
  - 1.0.0リリース - 2010-08-29
- バージョン0.xのお知らせ
  - 0.7.7リリース - 2010-08-25
  - 0.7.6リリース - 2010-08-19
- News in Senna period
  - Senna -> groonga - 2009-01-14
  - 2006-04-05
  - 2006-03-03
  - 2006-01-16
  - 2006-01-12
  - 2005-12-22
  - 2005-10-27
  - 2005-09-17
  - 2005-09-08
  - 2005-08-16
  - 2005-07-05
  - 2005-06-23
  - 2005-04-12