お知らせ

10.0.6リリース - 2020-08-29

改良

  • [logical_range_filter] 大きなデータの検索プランを改善しました。

    • 通常、 logical_range_filterlogical_select より高速ですが、以下のケースでは、 logical_select より遅くなっていました。

      • logical_range_filter には要求されたレコード数をなかなか見つけられない場合にシーケンシャル検索からインデックス検索に切り替える機能があります。( logical_range_filter は通常、検索対象のレコード数が多い場合は、シーケンシャル検索を使います。)

      • 上記の切り替えが発生した場合は、 logical_select と検索処理がほぼ同じになります。そのため、大きなデータを対象とした検索では、上記のケースで、 logical_range_filter は、 logical_select の数倍遅くなります。なぜなら、 logical_range_filter は検索後にソートを実行するためです。

    • 今回のリリースから、大きなデータを検索する場合に、今までよりシーケンシャル検索が採用されやすくしました。

    • これによって、 logical_select と同等の処理になるケースが減少し logical_range_filter のパフォーマンスが改善します。

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

  • Debian GNU/Linux へのインストール方法を変更しました。

    • groonga-archive-keyring の代わりに groonga-apt-source を使うように変更しました。 lintian コマンドが /etc/apt/sources.lists.d/ 配下にファイルを置くパッケージは apt-source を使うよう推奨しているためです。

      • lintian コマンドはパッケージングに共通のエラーをチェックするためのコマンドです。

      • インストール方法についての詳細は、以下のURLも参照してください。

  • [logical_select] highlight_htmlhighlight_full をサポートしました。

  • 値を持たない配列を削除した時、そのレコードのIDを再利用するようにしました。[GitHub#mroonga/mroonga#327][gaeeyoさんの報告]

    • 値を持たない配列を削除した場合、削除されたIDは再利用されません。

    • Groongaは大きなIDがあることによって、多くのストレージを使用します。大きなIDはそれだけで、多くのストレージを使うためです。

      • 大きなIDは、例えば、Mroongaの mroonga_operations のように多くの追加と削除によって発生します。

  • [select] インデックスを設定していない全文検索のパフォーマンスを改善しました。

  • [関数] 全ての引数が他のテーブルへの参照か、リテラルである関数のパフォーマンスを改善しました。

  • [インデックス構築] トークンカラムを使った静的インデックス構築のパフォーマンスを改善しました。 [GitHub#1126][naoaさんがパッチ提供]

  • "_score = func(...)" のパフォーマンスを改善しました。

    • _score の値が "_score = func(...)" のように関数によってのみ算出される場合のパフォーマンスを改善しました。

修正

  • 応答送信のエラーが発生した後の応答にゴミが含まれることがある問題を修正しました。

    • これは、クライアントが全ての応答を読み込まずにコネクションがクローズされた場合に発生することがあります。

感謝

  • gaeeyoさん

  • naoaさん

10.0.5リリース - 2020-07-30

改良

  • [select] -load_table で指定したテーブルに参照を格納できるようにしました。

    • --load-table は予め用意したテーブルに検索結果を格納する機能です。

      • 複数回検索が実行される場合、このテーブルに結果を格納することで、検索結果をキャッシュできます。

      • このテーブルを使うことで、初回以降の検索時間を短縮できます。

    • 今回のリリース以降で、以下のようにこのテーブルに別のテーブルへの参照を格納できます。

      • カラムの値を格納せず、参照のみを格納するため、このテーブルのサイズを小さくすることができます。

      • このテーブルに対して検索する場合、参照先のテーブルのインデックスを使って検索できます。

      table_create Logs TABLE_HASH_KEY ShortText
      column_create Logs timestamp COLUMN_SCALAR Time
      
      table_create Times TABLE_PAT_KEY Time
      column_create Times logs_timestamp COLUMN_INDEX Logs timestamp
      
      table_create LoadedLogs TABLE_HASH_KEY Logs
      
      load --table Logs
      [
      {
        "_key": "2015-02-03:1",
        "timestamp": "2015-02-03 10:49:00"
      },
      {
        "_key": "2015-02-03:2",
        "timestamp": "2015-02-03 12:49:00"
      },
      {
        "_key": "2015-02-04:1",
        "timestamp": "2015-02-04 00:00:00"
      }
      ]
      
      select \
        Logs \
        --load_table LoadedLogs \
        --load_columns "_key" \
        --load_values "_key" \
        --limit 0
      
      select \
        --table LoadedLogs \
        --filter 'timestamp >= "2015-02-03 12:49:00"'
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              2
            ],
            [
              [
                "_id",
                "UInt32"
              ],
              [
                "_key",
                "ShortText"
              ],
              [
                "timestamp",
                "Time"
              ]
            ],
            [
              2,
              "2015-02-03:2",
              1422935340.0
            ],
            [
              3,
              "2015-02-04:1",
              1422975600.0
            ]
          ]
        ]
      ]
      
  • [select] 以下のケースのソートのパフォーマンスを改善しました。

    • 多くのソートキーがID解決をする場合。

      • 例えば、以下の式はIDを解決する必要があります。

        • --filter true --sort_keys column

      • 例えば、以下の式はIDを解決する必要がありません。 擬似カラム _score は、結果テーブルに存在しており、ソーステーブルには存在しないためIDを解決する必要がありません。

        • --filter true --sort_keys _score

    • ソート対象のテーブルがキーを持っている場合。

      • したがって、 TABLE_NO_KEY はこの改善をサポートしていません。

  • [select] 以下のケースのパフォーマンスを少し改善しました。

    • 沢山のレコードがマッチする検索をしているケース。

    • 沢山のレコードに対してドリルダウンするケース。

  • [aggregator] score アクセサーをサポートしました。[GitHub#1120][naoaさんのパッチ提供]

    • 例えば、 以下のように _scoreaggregator_* の対象にできます。

      table_create Items TABLE_HASH_KEY ShortText
      column_create Items price COLUMN_SCALAR UInt32
      column_create Items tag COLUMN_SCALAR ShortText
      
      load --table Items
      [
      {"_key": "Book",  "price": 1000, "tag": "A"},
      {"_key": "Note",  "price": 1000, "tag": "B"},
      {"_key": "Box",   "price": 500,  "tag": "B"},
      {"_key": "Pen",   "price": 500,  "tag": "A"},
      {"_key": "Food",  "price": 500,  "tag": "C"},
      {"_key": "Drink", "price": 300,  "tag": "B"}
      ]
      
      select Items \
        --filter true \
        --drilldowns[tag].keys tag \
        --drilldowns[tag].output_columns _key,_nsubrecs,score_mean \
        --drilldowns[tag].columns[score_mean].stage group \
        --drilldowns[tag].columns[score_mean].type Float \
        --drilldowns[tag].columns[score_mean].flags COLUMN_SCALAR \
        --drilldowns[tag].columns[score_mean].value 'aggregator_mean(_score)'
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              6
            ],
            [
              [
                "_id",
                "UInt32"
              ],
              [
                "_key",
                "ShortText"
              ],
              [
                "price",
                "UInt32"
              ],
              [
                "tag",
                "ShortText"
              ]
            ],
            [
              1,
              "Book",
              1000,
              "A"
            ],
            [
              2,
              "Note",
              1000,
              "B"
            ],
            [
              3,
              "Box",
              500,
              "B"
            ],
            [
              4,
              "Pen",
              500,
              "A"
            ],
            [
              5,
              "Food",
              500,
              "C"
            ],
            [
              6,
              "Drink",
              300,
              "B"
            ]
          ],
          {
            "tag": [
              [
                3
              ],
              [
                [
                  "_key",
                  "ShortText"
                ],
                [
                  "_nsubrecs",
                  "Int32"
                ],
                [
                  "score_mean",
                  "Float"
                ]
              ],
              [
                "A",
                2,
                1.0
              ],
              [
                "B",
                3,
                1.0
              ],
              [
                "C",
                1,
                1.0
              ]
            ]
          }
        ]
      ]
      
  • [インデックス構築] VC++版の静的インデックス構築のパフォーマンスを改善しました。

  • [select] JSON形式で出力する際に NaNInfinity-Infinity の代わりに null を出力するようにしました。

    • これらの値はJSONではサポートされていないためです。

  • [select] 標準偏差の集計をサポートしました。

    • 例えば、以下のようにグループごとの標準偏差を計算できます。

      table_create Items TABLE_HASH_KEY ShortText
      column_create Items price COLUMN_SCALAR UInt32
      column_create Items tag COLUMN_SCALAR ShortText
      
      load --table Items
      [
      {"_key": "Book",  "price": 1000, "tag": "A"},
      {"_key": "Note",  "price": 1000, "tag": "B"},
      {"_key": "Box",   "price": 500,  "tag": "B"},
      {"_key": "Pen",   "price": 500,  "tag": "A"},
      {"_key": "Food",  "price": 500,  "tag": "C"},
      {"_key": "Drink", "price": 300,  "tag": "B"}
      ]
      
      select Items \
        --drilldowns[tag].keys tag \
        --drilldowns[tag].output_columns _key,_nsubrecs,price_sd \
        --drilldowns[tag].columns[price_sd].stage group \
        --drilldowns[tag].columns[price_sd].type Float \
        --drilldowns[tag].columns[price_sd].flags COLUMN_SCALAR \
        --drilldowns[tag].columns[price_sd].value 'aggregator_sd(price)' \
        --output_pretty yes
      [
        [
          0,
          1594339851.924836,
          0.002813816070556641
        ],
        [
          [
            [
              6
            ],
            [
              [
                "_id",
                "UInt32"
              ],
              [
                "_key",
                "ShortText"
              ],
              [
                "price",
                "UInt32"
              ],
              [
                "tag",
                "ShortText"
              ]
            ],
            [
              1,
              "Book",
              1000,
              "A"
            ],
            [
              2,
              "Note",
              1000,
              "B"
            ],
            [
              3,
              "Box",
              500,
              "B"
            ],
            [
              4,
              "Pen",
              500,
              "A"
            ],
            [
              5,
              "Food",
              500,
              "C"
            ],
            [
              6,
              "Drink",
              300,
              "B"
            ]
          ],
          {
            "tag": [
              [
                3
              ],
              [
                [
                  "_key",
                  "ShortText"
                ],
                [
                  "_nsubrecs",
                  "Int32"
                ],
                [
                  "price_sd",
                  "Float"
                ]
              ],
              [
                "A",
                2,
                250.0
              ],
              [
                "B",
                3,
                294.3920288775949
              ],
              [
                "C",
                1,
                0.0
              ]
            ]
          }
        ]
      ]
      
      • aggregate_sd(target, {"unbiased": true}) と指定することで、不偏標準偏差も計算できます。

  • [Windows] Visual Studio 2013のサポートをやめました。

修正

  • [Groonga HTTPサーバー] 応答がエラーで中断された時に、 shutdown?immediate を実行しても、リクエストが中断しない問題を修正しました。

  • リクエスト中にエラーが発生した時にクラッシュする問題を修正しました。

    • これは、Apache Arrow形式を使っている時にのみ発生します。

    • 前のリクエストがエラーによって中断された後に再度Groongaへリクエストを送信した時にGroongaがクラッシュします。

  • [between] 一時テーブルを使用した時にクラッシュする問題を修正しました。

    • 例えば、 between の第一引数に動的カラムを指定すると、Groongaがクラッシュしていました。

  • プラグインで作成したプロシージャーが予期せず解放される問題を修正しました。

    • 参照カウントモードでのみ発生します。

    • plugin_register を使っていない場合は、発生しません。

    • plugin_register を実行したプロセスでは発生しません。

    • plugin_register を実行していないプロセスで発生します。

  • token_column を使った静的インデックス構築中に正規化エラーが発生する問題を修正しました。[GitHub#1122][naoaさんの報告]

感謝

  • naoaさん

10.0.4リリース - 2020-06-29

改良

  • [テーブル] ハッシュテーブルで4億件のレコードの登録をサポートしました。

  • [select] _score が再帰的に値を取得しない時のパフォーマンスを改善しました。

    • Groongaは、検索結果が検索対象の時に、 _score の値を再帰的に取得します。

    • 例えば、 slices は検索結果が検索対象です。したがって、 slices を使っているクエリーでは、この改善は効果がありません。

  • [ログ] ドリルダウンのキーをクエリーログに出力するようにしました。

  • [reference_acquire], [reference_release] 参照カウントモード用に新しいコマンドを追加しました。

    • 短い間隔で複数の load を呼び出す必要がある場合、参照カウントモードによる自動クローズによってパフォーマンスが低下します。

    • 複数の load の前に reference_acquire を呼び、 複数の load の後に reference_release を呼ぶことで、このパフォーマンスの低下を避けることができます。reference_acquirereference_release の間は自動クローズは無効になります。

      • reference_acquire が、対象のオブジェクトの参照を取得するためです。

    • パフォーマンスに影響のある操作が完了したら、 reference_release を呼ぶ必要があります。

    • reference_release を呼ばない場合、参照カウントモードは機能しません。

  • [select] 一度の drilldown で複数グループの集計をサポートしました。

    • 以下のように、一回の drilldown で異なるグループ毎に和と算術平均を計算できるようになりました。

      table_create Items TABLE_HASH_KEY ShortText
      column_create Items price COLUMN_SCALAR UInt32
      column_create Items quantity COLUMN_SCALAR UInt32
      column_create Items tag COLUMN_SCALAR ShortText
      
      load --table Items
      [
      {"_key": "Book",  "price": 1000, "quantity": 100, "tag": "A"},
      {"_key": "Note",  "price": 1000, "quantity": 10,  "tag": "B"},
      {"_key": "Box",   "price": 500,  "quantity": 15,  "tag": "B"},
      {"_key": "Pen",   "price": 500,  "quantity": 12,  "tag": "A"},
      {"_key": "Food",  "price": 500,  "quantity": 111, "tag": "C"},
      {"_key": "Drink", "price": 300,  "quantity": 22,  "tag": "B"}
      ]
      
      select Items \
        --drilldowns[tag].keys tag \
        --drilldowns[tag].output_columns _key,_nsubrecs,price_sum,quantity_sum \
        --drilldowns[tag].columns[price_sum].stage group \
        --drilldowns[tag].columns[price_sum].type UInt32 \
        --drilldowns[tag].columns[price_sum].flags COLUMN_SCALAR \
        --drilldowns[tag].columns[price_sum].value 'aggregator_sum(price)' \
        --drilldowns[tag].columns[quantity_sum].stage group \
        --drilldowns[tag].columns[quantity_sum].type UInt32 \
        --drilldowns[tag].columns[quantity_sum].flags COLUMN_SCALAR \
        --drilldowns[tag].columns[quantity_sum].value 'aggregator_sum(quantity)'
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              6
            ],
            [
              [
                "_id",
                "UInt32"
              ],
              [
                "_key",
                "ShortText"
              ],
              [
                "price",
                "UInt32"
              ],
              [
                "quantity",
                "UInt32"
              ],
              [
                "tag",
                "ShortText"
              ]
            ],
            [
              1,
              "Book",
              1000,
              100,
              "A"
            ],
            [
              2,
              "Note",
              1000,
              10,
              "B"
            ],
            [
              3,
              "Box",
              500,
              15,
              "B"
            ],
            [
              4,
              "Pen",
              500,
              12,
              "A"
            ],
            [
              5,
              "Food",
              500,
              111,
              "C"
            ],
            [
              6,
              "Drink",
              300,
              22,
              "B"
            ]
          ],
          {
            "tag": [
              [
                3
              ],
              [
                [
                  "_key",
                  "ShortText"
                ],
                [
                  "_nsubrecs",
                  "Int32"
                ],
                [
                  "price_sum",
                  "UInt32"
                ],
                [
                  "quantity_sum",
                  "UInt32"
                ]
              ],
              [
                "A",
                2,
                1500,
                112
              ],
              [
                "B",
                3,
                1800,
                47
              ],
              [
                "C",
                1,
                500,
                111
              ]
            ]
          }
        ]
      ]
      
  • [groonga-httpd] スタンドアローンモードで、 --pid-path をサポートしました。

    • 以前のバージョンのスタンドアローンモードでは、 --pid-path は無視されていました。

  • [io_flush] 参照カウントモードに対応しました。

  • [logical_range_filter],[logical_count] 参照カウントモードに対応しました。

  • [Groonga HTTPサーバー] 最後のチャンクの後にヘッダーをつけないようにしました。

    • 最後のチャンクの後のヘッダーを無視するHTTPクライアントが存在する可能性があるためです。

  • [vector_slice] Float32 型のベクターをサポートしました。 [GitHub#1106 naoaさんがパッチ提供]

  • トークンカラムを使った、並列静的インデックス構築をサポートしました。

    • 予めトークナイズされたデータから複数スレッドで静的インデックスの構築ができるようになりました。

    • 以下の環境変数で、並列静的インデックス構築のパラメータを調整できます。

      • GRN_TOKEN_COLUMN_PARALLEL_CHUNK_SIZE : スレッド毎にどのくらいのレコードを処理するかを指定します。

        • デフォルト値は 1024 レコードです。

      • GRN_TOKEN_COLUMN_PARALLEL_TABLE_SIZE_THRESHOLD : どのくらいのソースレコードで並列化するかを指定します。

        • デフォルト値は 102400 レコードです。

  • [select] 参照カウントモード時の load_table のパフォーマンスを改善しました。

修正

  • シャードをまたいでいて、かつ --filter を指定していない動的カラムを使って検索すると、Gronngaのデータベースが破損する問題を修正しました。

  • schema コマンドの結果に Float32 型が表示されなかった問題を修正しました。

  • 参照 uvector が要素を持っていないとき、 _nsubrecs を余分にカウントする問題を修正しました。

感謝

  • naoaさん

10.0.3リリース - 2020-05-29

改良

  • 予めトークナイズされたデータから転置インデックスを構築できるようになりました。

    • これにより、インデックスの構築が高速化します。

    • この改善を使うには、トークンカラムを準備する必要があります。

    • トークンカラムは、インデックスカラムのように自動で値が生成されます。

    • トークンカラムの値はソースカラムの値をトークナイズすることで生成されます。

    • トークンカラムは以下のようにソースカラムを設定することで作成できます。

      table_create Terms TABLE_PAT_KEY ShortText \
        --normalizer NormalizerNFKC121 \
        --default_tokenizer TokenNgram
      
      table_create Notes TABLE_NO_KEY
      column_create Notes title COLUMN_SCALAR Text
      
      # The last "title" is the source column.
      column_create Notes title_terms COLUMN_VECTOR Terms title
      
  • [select] 関数の引数に vector を指定できるようになりました。

    • 例えば、 queryflags オプションを vector を使って以下のように記述できます。

      select \
        --table Memos \
        --filter 'query("content", "-content:@mroonga", \
                        { \
                          "expander": "QueryExpanderTSV", \
                          "flags": ["ALLOW_LEADING_NOT", "ALLOW_COLUMN"] \
                        })'
      
  • [select] 動的カラムに新しいステージ result_set を追加しました。

    • このステージは、結果セットのテーブルにカラムを作ります。したがって、 queryfilter が存在しない場合は作られません。

      • queryfilter が存在しない場合は、結果セットのテーブルが作られないためです。

    • このステージでは _value は使用できません。 result_set ステージの値は score_column に格納されます。

  • [vector_slice] 重み付きベクターの重みに Float32 型が使えるようになりました。 [GitHub#1106 naoaさんがパッチ提供]

  • [select] drilldownsの動的カラムのステージに filteredoutput を追加しました。 [GitHub#1101 naoaさんがパッチ提供][GitHub#1100 naoaさんがパッチ提供]

    • drilldowns[Label].stage filtereddrilldowns[Label].stage output のように drilldowns の動的カラムのステージに filteredoutput を使えます。

  • [select] ドリルダウンでの集計に Float 型の値をサポートしました。

    • MAXMINSUM を使って Float 型の値の最大値、最小値、合計値を集計できます。

  • [query] [geo_in_rectangle] [geo_in_circle] query()geo_in_rectangle()geo_in_circle() に新しいオプション score_column を追加しました。

    • score_column を使うことで条件毎にスコアの値を格納できます。

    • 通常、Groongaは、全ての条件のスコアーを加算してスコアーを計算しますが、条件毎にスコアーの値を取得したいこともあります。

    • 例えば以下のように、中心座標にどれだけ近いかをスコアーとして使いたい場合に score_column が使えます。

    table_create LandMarks TABLE_NO_KEY
    column_create LandMarks name COLUMN_SCALAR ShortText
    column_create LandMarks category COLUMN_SCALAR ShortText
    column_create LandMarks point COLUMN_SCALAR WGS84GeoPoint
    
    table_create Points TABLE_PAT_KEY WGS84GeoPoint
    column_create Points land_mark_index COLUMN_INDEX LandMarks point
    
    load --table LandMarks
    [
      {"name": "Aries"      , "category": "Tower"     , "point": "11x11"},
      {"name": "Taurus"     , "category": "Lighthouse", "point": "9x10" },
      {"name": "Gemini"     , "category": "Lighthouse", "point": "8x8"  },
      {"name": "Cancer"     , "category": "Tower"     , "point": "12x12"},
      {"name": "Leo"        , "category": "Tower"     , "point": "11x13"},
      {"name": "Virgo"      , "category": "Temple"    , "point": "22x10"},
      {"name": "Libra"      , "category": "Tower"     , "point": "14x14"},
      {"name": "Scorpio"    , "category": "Temple"    , "point": "21x9" },
      {"name": "Sagittarius", "category": "Temple"    , "point": "43x12"},
      {"name": "Capricorn"  , "category": "Tower"     , "point": "33x12"},
      {"name": "Aquarius"   , "category": "mountain"  , "point": "55x11"},
      {"name": "Pisces"     , "category": "Tower"     , "point": "9x9"  },
      {"name": "Ophiuchus"  , "category": "mountain"  , "point": "21x21"}
    ]
    
    select LandMarks \
      --sort_keys 'distance' \
      --columns[distance].stage initial \
      --columns[distance].type Float \
      --columns[distance].flags COLUMN_SCALAR \
      --columns[distance].value 0.0 \
      --output_columns 'name, category, point, distance, _score' \
      --limit -1 \
      --filter 'geo_in_circle(point, "11x11", "11x1", {"score_column": distance}) && category == "Tower"'
    [
      [
        0,
        1590647445.406149,
        0.0002503395080566406
      ],
      [
        [
          [
            5
          ],
          [
            [
              "name",
              "ShortText"
            ],
            [
              "category","ShortText"
            ],
            [
              "point",
              "WGS84GeoPoint"
            ],
            [
              "distance",
              "Float"
            ],
            [
              "_score",
              "Int32"
            ]
          ],
          [
            "Aries",
            "Tower",
            "11x11",
            0.0,
            1
          ],
          [
            "Cancer",
            "Tower",
            "12x12",
            0.0435875803232193,
            1
          ],
          [
            "Leo",
            "Tower",
            "11x13",
            0.06164214760065079,
            1
          ],
          [
            "Pisces",
            "Tower",
            "9x9",
            0.0871751606464386,
            1
          ],
          [
            "Libra",
            "Tower",
            "14x14",
            0.1307627409696579,
            1
          ]
        ]
      ]
    ]
    
    • 上記の例では、 _score によるソートは意味をなしません。 category == "Tower" によって、 _score の値は全て 1 になるためです。しかし、 socre_column を使うことで、中心座標からの距離でソートできます。

  • [Windows] クラッシュしていないくてもエラー時にはバックトレースが出力されるようになりました。

  • [Windows] 古いWindowsのサポートをやめました。

    • 10.0.3から、Windows 8 (Windows Server 2012) 以降を要求します。

  • [select] 参照可能なソートキーとそうでないソートキーが混在しているときのソートパフォーマンスを改善しました。

    • 参照可能なソートキーとそうでないソートキーが混在していて、参照可能なキーが2つ以上あるときのソートパフォーマンスを改善しました。

      • 参照可能なソートキーとは以下のソートキー以外のことです。

        • 圧縮されたカラム

        • ドリルダウンのキーに複数の値が指定されているドリルダウンの値を格納する _value

        • ShortText 型のキーを持たないパトリシアトライテーブルの _key

        • _score

    • 文字列以外のソートキーが多いほど、ソートに使用するメモリ使用量が少なくなります。

  • [select] 全てのソートキーが参照可能なキーの時のソートのパフォーマンスを改善しました。

  • [select] _socre = column1*X + column2*Y + ... の場合のスコアラーのパフォーマンスを改善しました。

    • この最適化は、 _score 内に多くの + または * がある場合に効きます。

    • 現状、 +* に対してのみ効果があります。

  • [select] フレーズ近傍検索をサポートしました。

    • フレーズ単位で近傍検索できます。

      • フレーズ近傍検索のクエリー構文は、 *NP"Phrase1 phrase2 ..." です。

      • フレーズ近傍検索のスクリプト構文は、 column *NP "phrase1 phrase2 ..." です。

      • 検索対象のフレーズにスペースを含む場合、 以下のようにフレーズを " で囲うことで検索できます。

        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 NormalizerNFKC121
        column_create Terms entries_content COLUMN_INDEX|WITH_POSITION Entries content
        
        load --table Entries
        [
        {"content": "I started to use Groonga. It's very fast!"},
        {"content": "I also started to use Groonga. It's also very fast! Really fast!"}
        ]
        
        select Entries --filter 'content *NP "\\"I started\\" \\"use Groonga\\""' --output_columns 'content'
        [
          [
            0,
            1590469700.715882,
            0.03997230529785156
          ],
          [
            [
              [
                1
              ],
              [
                [
                  "content",
                  "Text"
                ]
              ],
              [
                "I started to use Groonga. It's very fast!"
              ]
            ]
          ]
        ]
        
  • [ベクターカラム] 重み付きベクターの重みに float32 型を追加しました。

    • uint32 の代わりに float32 として重みを格納できます。

    • この機能を使うには、 column_create 実行時に WEIGHT_FLOAT32 フラグを追加する必要があります。

      column_create Records tags COLUMN_VECTOR|WITH_WEIGHT|WEIGHT_FLOAT32 Tags
      
    • 今の所、 WEIGHT_FLOAT32 フラグは、 COLUMN_INDEX フラグと併用できません。

  • 以下のAPIを公開しました。

    • grn_obj_is_xxx 関数を追加しました。詳細は以下の通りです。

      • grn_obj_is_weight_vector(grn_ctx *ctx, grn_obj *obj)

        • 重み付きベクターかどうかを bool として返します。

      • grn_obj_is_uvector(grn_ctx *ctx, grn_obj *obj)

        • uvector かどうかを bool として返します。

          • uvector とは、要素のサイズが固定の vector です。

      • grn_obj_is_weight_uvector(grn_ctx *ctx, grn_obj *obj)

        • 重み付きuvectorかどうかを bool として返します。

    • grn_type_id_size(grn_ctx *ctx, grn_id id) を追加しました。

      • Groongaのデータ型のサイズを size_t として返します。

    • grn_selector_data_get_xxx を追加しました。詳細は以下の通りです。

      • これらの関数はセレクター関連のデータを返します。

        • これらの関数はセレクターの中で呼び出すことを想定しています。セレクター以外の場所で呼び出された場合は、 NULL を返します。

          • grn_selector_data_get(grn_ctx *ctx)

            • セレクター呼び出しに関する全ての情報を grn_selector_data * 構造体として返します。

          • grn_selector_data_get_selector(grn_ctx *ctx, grn_selector_data *data)

            • セレクター自身を grn_obj * として返します。

          • grn_selector_data_get_expr(grn_ctx *ctx, grn_selector_data *data)

            • セレクターに使用されている、 --filter 条件や --query 条件を grn_obj * として返します。

          • grn_selector_data_get_table(grn_ctx *ctx, grn_selector_data *data)

            • 検索対象のテーブルを grn_obj * として返します。

          • grn_selector_data_get_index(grn_ctx *ctx, grn_selector_data *data)

            • セレクターに使われているインデックスを grn_obj * として返します。

          • grn_selector_data_get_args(grn_ctx *ctx, grn_selector_data *data, size_t *n_args)

            • セレクターが呼び出した関数の引数を grn_obj * として返します。

          • grn_selector_data_get_result_set(grn_ctx *ctx, grn_selector_data *data)

            • 結果テーブルを grn_obj * として返します。

          • grn_selector_data_get_op(grn_ctx *ctx, grn_selector_data *data)

            • 既存の結果セットに対してどう集合演算したかを grn_operator として返します。

    • grn_plugin_proc_xxx 関数を追加しました。詳細は以下の通りです。

      • grn_plugin_proc_get_value_operator(grn_ctx *ctx, grn_obj *value, grn_operator default_operator, const char *context)

        • クエリーオペレーターを grn_operator として返します。

          • 例えば、 &&GRN_OP_ANDP として返されます。

      • grn_plugin_proc_get_value_bool(grn_ctx *ctx, grn_obj *value, bool default_value, const char *tag)

        • 以下の関数の引数 with_transposition のように true または false が指定される値を bool として返します。( bool はC言語のデータ型です。)

          fuzzy_search(column, query, {"max_distance": 1, "prefix_length": 0, "max_expansion": 0, "with_transposition": true})
          
    • grn_proc_options_xxx 関数を追加しました。詳細は以下の通りです。

      • これらは、 query() でのみ使えます。

        • grn_proc_options_parsev(grn_ctx *ctx, grn_obj *options, const char *tag, const char *name, va_list args) を追加しました。

          • オプションのパースを実行します。

          • 今までは、オプションのパースを自分で実装しなければなりませんでしたが、この関数を呼び出すだけでオプションをパースできます。

        • grn_proc_options_parse(grn_ctx *ctx, grn_obj *options, const char *tag, const char *name, ...)

          • grn_proc_option_parsev() を呼び出します。したがって、この関数の機能は、 grn_proc_options_parsev() と同じです。

          • grn_proc_options_parsev() とは、インターフェースだけが異なります。

    • grn_text_printfv(grn_ctx *ctx, grn_obj *bulk, const char *format, va_list args) を追加しました。

      • grn_text_vprintf は10.0.3から非推奨になりました。 代わりに grn_text_printfv を使ってください。

    • grn_type_id_is_float_family(grn_ctx *ctx, grn_id id) を追加しました。

      • grn_type_idGRN_DB_FLOAT32 または GRN_DB_FLOAT かどうかを bool として返します。

    • grn_dat_cursor_get_max_n_records(grn_ctx *ctx, grn_dat_cursor *c) を追加しました。

      • カーソルが保持できるレコード数の最大値を size_t として返します。(このAPIはDATテーブル用です。)

    • grn_table_cursor_get_max_n_records(grn_ctx *ctx, grn_table_cursor *cursor) を追加しました。

      • カーソルが保持できるレコード数の最大値を返します。

      • 全ての種類(TABLE_NO_KEY, TABLE_HASH_KEY, TABLE_DAT_KEY, TABLE_PAT_KEY)のテーブルで使えます。

    • grn_result_set_add_xxx を追加しました。詳細は以下の通りです。

      • grn_result_set_add_record(grn_ctx *ctx, grn_hash *result_set, grn_posting *posting, grn_operator op)

        • 結果セットのテーブルにレコードを追加します。

        • grn_ii_posting_add_float は10.0.3から非推奨になりました。代わりに grn_rset_add_records() を使ってください。

      • grn_result_set_add_table(grn_ctx *ctx, grn_hash *result_set, grn_obj *table, double score, grn_operator op)

        • 結果セットにテーブルを追加します。

      • grn_result_set_add_table_cursor(grn_ctx *ctx, grn_hash *result_set, grn_table_cursor *cursor, double score, grn_operator op)

        • 結果セットにカーソル内のレコードを追加します。

    • grn_vector_copy(grn_ctx *ctx, grn_obj *src, grn_obj *dest) を追加しました。

      • vector オブジェトをコピーします。 vector オブジェクトのコピーに成功したかどうかを返します。

    • grn_obj_have_source(grn_ctx *ctx, grn_obj *obj) を追加しました。

      • ソースカラムを持つカラムかどうかを bool として返します。

    • grn_obj_is_token_column(grn_ctx *ctx, grn_obj *obj) を追加しました。

      • トークンカラムかどうかを bool として返します。

    • grn_hash_add_table_cursor(grn_ctx *ctx, grn_hash *hash, grn_table_cursor *cursor, double score) を追加しました。

      • 結果セットを一括して挿入するための関数です。 grn_ii_posting_add() を使ってレコードを挿入するより高速です。

修正

  • 複数のスレッドから、同時にモジュール(トークナイザー、ノーマライザー、トークンフィルター)が使われた場合にクラッシュする問題を修正しました。

  • Float32 の値を表示する際の精度を修正しました。

    • 10.0.3から Float32 の値の精度は、 8桁から7桁になります。

  • 動的カラムのパラメーターだけが違うクエリーが実行された時にGroongaが誤ったキャッシュを使用していた問題を修正しました。 [GitHub#1102 naoaさんがパッチ提供]

感謝

  • naoaさん

10.0.2リリース - 2020-04-29

改良

  • time_classify_* 関数が uvector に対応しました。 [GitHub#1089][naoaさんがパッチ提供]

    • uvector とは、要素のサイズが固定のベクターです。

    • 例えば、Time型の要素を格納しているベクターは uvector です。

  • ゼロコピーで値を参照できないソートキーが混在しているケースでソートのパフォーマンスを改善しました。

    • いくつかのソートキー(例えば、 _score 等)の値はゼロコピーで値を参照できません。

    • これらの値が一つでも含まれる場合、以前は全てのソートキーの値をコピーしていました。

    • 今回の変更から、参照できないソートキーの値だけコピーし、参照可能なソートキーの値はコピーせずに参照するようにしました。

    • ただ、この変更で全てのソートキーの値が参照可能なケースでパフォーマンスが落ちる可能性があります。

  • 重み付きベクターをJSON文字列としてロードできるようにしました。

    • 以下の例のように、重み付きベクターをJSON文字列としてロードできます。

      table_create Tags TABLE_PAT_KEY ShortText
      table_create Data TABLE_NO_KEY
      column_create Data tags COLUMN_VECTOR|WITH_WEIGHT Tags
      column_create Tags data_tags COLUMN_INDEX|WITH_WEIGHT Data tags
      load --table Data
      [
        {"tags": "{\"fruit\": 10, \"apple\": 100}"},
        {"tags": "{\"fruit\": 200}"}
      ]
      
  • Float32 型をサポートしました。

    • Groongaは既に Float 型を持っていますが、これは、倍精度浮動小数点数です。したがって、単精度浮動小数点数のみを使う場合は、効率が悪いです。

    • Float32 型を追加することで、より適切な型を選択できるようになりました。

  • 以下のAPIを公開しました。

    • grn_obj_unref(grn_ctx *ctx, grn_obj *obj)

      • このAPIは参照カウントモードのときのみ使用します。(参照カウントモードとは、 GRN_ENABLE_REFERENCE_COUNT=yes の状態のことです。)

        • このAPIは、参照カウントモードの時のみ grn_obj_unlink() を呼び出します。参照カウントモード以外の時は、何もしません。

        • 参照カウントモードの時のみ grn_obj_unlink() を呼び出す必要がある時に便利です。

        • 以下の例のように、参照カウントモードかどうかの条件を書かなくて良くなるためです。

          • grn_obj_unref() を使用しない場合の例です。

            if (grn_enable_reference_count) {
             grn_obj_unlink(ctx, obj);
            }
            
          • grn_obj_ubref() を使用する場合の例です。

            grn_obj_ubref(ctx, obj);
            
    • grn_get_version_major(void)

    • grn_get_version_minor(void)

    • grn_get_version_micro(void)

      • uint32_t としてGroongaのメジャー、マイナー、マイクロバージョンを返します。

    • grn_posting_get_record_id(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_section_id(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_position(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_tf(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_weight(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_weight_float(grn_ctx *ctx, grn_posting *posting)

    • grn_posting_get_rest(grn_ctx *ctx, grn_posting *posting)

      • これらは、ポスティングリストの情報を返します。

      • これらのAPIは、 grn_posting_get_weight_float 以外は、 uint32_t として値を返します。

      • grn_posting_get_weight_floatfloat として値を返します。

      • grn_posting_get_section_id(grn_ctx *ctx, grn_posting *posting)

        • セクションIDとはカラム名の内部表現です。

        • カラム名を文字列としてポスティングリストに格納すると、情報量が多くなり無駄な容量を使います。

        • したがって、カラム名をセクションIDという数値としてポスティングリストに格納することで、情報量を圧縮し使用する容量を少なくしています。

      • grn_posting_get_tf(grn_ctx *ctx, grn_posting *posting)

        • grn_posting_get_tftf とは、単語の出現頻度です。

      • grn_posting_get_weight_float(grn_ctx *ctx, grn_posting *posting)

        • トークンの重みを float として返します。

        • 今後はトークンの重みを取得する際はこのAPIを使用することをおすすめします。

          • 近い将来、重みは内部的に uint32_t から float に変更するためです。

修正

  • 32bit GUN/Linux等でGroongaがクラッシュすることがある問題を修正しました。

  • 関係のないカラムの値をクリアーしてしまう問題を修正しました。 [GitHub#1087][sutaminさんの報告]

  • dump コマンドでレコードをダンプした時にメモリリークする問題を修正しました。

  • output_columns に無効な値を指定した時にメモリリークする問題を修正しました。

  • snippet 関数を実行する時にメモリリークする問題を修正しました。

  • 以下の条件を満たした時にメモリリークする問題を修正しました。

    • initial ステージで動的カラムを使用した場合。

    • select コマンドの引数 slices を使用した場合。

  • logical_table_remove でテーブルを削除した際にメモリリークする問題を修正しました。

  • 参照カウントモードを使用した時にメモリリークする問題を修正しました。

    • 参照カウントモードとは、 GRN_ENABLE_REFERENCE_COUNT=yes の状態のことです。

    • この機能は実験的です。パフォーマンスが低下することがあります。

  • Apache Arrow形式でデータをロードした際に _key アクセサーを解放しすぎる問題を修正しました。

感謝

  • sutaminさん

  • naoaさん

10.0.1リリース - 2020-03-30

Groonga 10.0.0 のUbuntuとWindows(VC++版)のパッケージに誤りがあったため Groonga 10.0.1 をリリースしました。

既にCentOS、Debian、Windows(MinGW版)のGroonga 10.0.0を使用している方は、そのまま使っていただいて問題ありません。

修正

  • Windows(VC++版)のパッケージに不足していたランタイム(vcruntime140_1.dll)を追加しました。

10.0.0リリース - 2020-03-29

改良

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

  • [httpd] 出力形式を拡張子として指定できるようにしました。

    • 例えば、 load?output_type=json の代わりに load.json と書けます。

  • [ログ] Linuxのdumpレベルのログにオープンしたファイルとクローズしたファイルのパスを出力するようにしました。

  • [ログ] Windowsのdebugレベルのログにオープンしたファイルとクローズしたファイルのパスを出力するようにしました。

  • 以下のAPIとマクロを追加しました。

    • grn_timeval_from_double(grn_ctx, double)

      • このAPIは、 double 型を grn_timeval 型に変換します。

      • grn_timeval 型の値を返します。

    • GRN_TIMEVAL_TO_NSEC(timeval)

      • このマクロは、 grn_timeval 型の値を uint64_t 型の値としてナノ秒に変換します。

    • GRN_TIME_USEC_TO_SEC(usec)

      • このマクロは、ミリ秒を秒に変換します。

  • 以下のマクロを非推奨にしました。

    • GRN_OBJ_FORMAT_FIN(grn_ctx, grn_obj_format)

      • 10.0.0から代わりに grn_obj_format_fin(grn_ctx, grn_obj_format) を使ってください。

  • [logical_range_filter],[dump] ストリーム出力に対応しました。

    • この機能は command_version 3 以降で使えます。headerがbodyの後に出力されます。

    • 現在、この機能をサポートしているのは、 dumplogical_range_filter のみです。

    • logical_range_filter は、 command_version 3 以降では、常に出力がstreamとして返ります。

    • この機能は以下の制限があります。

      • limit に指定できる負の値は -1 のみです。

      • MessagePack形式の出力はサポートしていません。

    • この変更で、JSONの応答内容を少し変更しています。

      • 以下のように以前のバージョンとは、キーの順序が異なっています。

        • 以前のバージョンのキーの順序

          {
            "header": {...},
            "body": {...}
          }
          
        • 本バージョン(10.0.0)のキーの順序

          {
            "body": {...},
            "header": {...}
          }
          
    • dumplogical_range_filtercommand_version 3 で実行した時はキャッシュが効きません。

      • 10.0.0から dumplogical_range_filtercommand_version 3 の時にストリームで応答を返すので、応答全体をキャッシュできないためです。

  • [logical_range_filter] Apache Arrow形式での応答をサポートしました。

    • 以下のデータ型をサポートしています。

      • UInt8

      • Int8

      • UInt16

      • Int16

      • UInt32

      • Int32

      • UInt64

      • Int64

      • Time

      • ShortText

      • Text

      • LongText

      • Vector of Int32

      • Reference vector

  • Ubuntu 20.04 (Focal Fossa)をサポートしました。

  • Ubuntu 19.04 (Disco Dingo)のサポートをやめました。

    • このバージョンはEOLになっているためです。

9.1.2リリース - 2020-01-29

改良

  • [tools] 指定したテーブルまたはカラムのファイルのみをコピーするスクリプトを追加しました。

    • このスクリプトの名前は、copy-related-files.rbです。

    • このスクリプトは非常に大きいデータベースから指定したテーブルまたはカラムを抽出したい場合に便利です。

    • 特定のテーブルまたはカラムに関連するファイルは、障害の再現に必要なことがあります。

    • データベースをまるごと提供するのが難しい場合は、このツールを使って対象のテーブルまたはカラムに関連するファイルを抽出できます。

  • [shutdown] 全てのスレッドが使われている場合でも、 /d/shutdown?mode=immediate を即時受け付けるようにしました。

    • この機能はGroonga HTTPサーバでのみ使えます。

  • GRN_ENABLE_REFERENCE_COUNT=yes を使うと、使用していないオブジェクトをすぐに開放します。

    • この機能は実験的です。パフォーマンスが低下します。

    • 多くのテーブルにまたがるデータをロードする際等にメモリーの使用量を一定量に保つ効果が期待できます。

  • [CentOS] groonga-release パッケージをバージョンごとに用意しました。

    • インストール方法に少し変更があるので注意してください。

  • [Debian GNU/Linux] Groongaのaptリポジトリーの追加に groonga-archive-keyring を使うようにしました。

    • この改善によって、Groongaのaptリポジトリーを簡単に追加できます。

    • groonga-archive-keyring はGroongaのaptリポジトリーを使うための全ての情報が入っています。そのため、リポジトリー情報やPGPキーの変更を意識する必要がありません。

    • groonga-archive-keyring はdebパッケージなので、 apt update で簡単に更新できます。

9.1.1リリース - 2020-01-07

改良

  • [load] Apache Arrow 形式のデータをサポートしました。

    • Apache Arrow形式のデータを使うことで、パースのコストを削減でき、他のフォーマットより高速にデータをロードできる可能性があります。

    • この変更によって、他のデータ分析システムからApache Arrow形式のデータを直接Groongaへ入力することもできます。

    • Apache Arrow形式のフォーマットはHTTPインターフェイスでのみ使えます。コマンドラインインターフェイスでは使えません。

  • [load] Apache Arrow 形式のロード方法をドキュメントに追加しました。

  • [load] エラーメッセージを改善しました。

    • load コマンドのレスポンスにエラーメッセージも含むようにしました。

    • この変更によって、データのロードに失敗した場合、 load コマンドのエラーの詳細を出力します。

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

  • [Groonga HTTPサーバー] HTTPリクエストのbodyにコマンドのパラメータを指定できるようにしました。

    • この場合、 Content-Typeapplication/x-www-form-urlencoded を指定しなければいけません。

  • [Groonga HTTPサーバー] HTTP POST の使用方法をドキュメントに追加しました。

9.1.0リリース - 2019-11-29

改良

  • "&&"演算のパフォーマンスを改善しました。

    • 例えば、以下のような条件式のパフォーマンスが向上します。

    • ( A || B ) && ( C || D ) && ( E || F) ...

  • [TokenMecab] TokenMecabuse_base_form オプションを追加しました。

    • このオプションによってトークンの原型を使って検索できます。

    • 例えば、このオプションを使って"支えた"を検索した場合、"支える"もヒットします。

修正

  • インデックスがアクセサーの際にパフォーマンスが低下する問題を修正しました。

    • 例えば、以下のような条件を含むクエリーで起こります。

      • accessor @ query

      • accessor == query

  • バッファーが十分に大きい時に、検索結果の推定サイズがオーバーフローする問題を修正しました。 [PGroonga#GitHub#115][Albert Songさんの報告]

  • test(1)のポータビリティを改善しました。(おばたさんがパッチ提供)

  • 不足しているツールを追加

    • 前のバージョンに index-column-diff-all.shobject-inspect-all.sh がバンドルされていなかったためです。

感謝

  • Albert Songさん

  • おばたさん

9.0.9リリース - 2019-10-30

注釈

今回のバージョンからパフォーマンスが低下しているかもしれません。もし、以前よりパフォーマンスが低下していたら、是非、再現手順を報告してほしいです。

改良

  • [ログ] 応答の送信時間をクエリーログに出力するように改良しました。

  • [status] status コマンドの応答に現在のジョブ数を追加しました。

  • [groonga-httpd] $request_time をサポートしました。

    • 以前のバージョンでは、 log_format ディレクティブに $request_time を指定しても、$request_time の値は常に0でした。

    • 今回のバージョンから、 $request_time を指定した場合、 groonga-httpd は正しい時間を出力します。

  • [groonga-httpd] $request_time の設定方法をドキュメントに追加しました。

  • Ubuntu 19.10(Eoan Ermine)をサポートしました。

  • CentOS 8をサポートしました。(実験的)

    • CentOS 8向けのパッケージは開発用のパッケージが不足しているため、一部の機能が使えません。(例えば、 TokenMecab が使えなかったり、JSON文字列からint32のベクターへのキャストが出来なかったりします。)

  • [tools] index_column_diff コマンドを簡単に実行するスクリプトを追加しました。

    • このスクリプトの名前は、index-column-diff-all.shです。

    • このスクリプトは、Groongaのデータベースからインデックスカラムを抽出し、抽出したインデックスカラムに対して index_column_diff を実行します。

  • [tools] object_inspect コマンドを全てのオブジェクトに対して実行するスクリプトを追加しました。

    • このスクリプトの名前は、object-inspect-all.shです。

修正

  • between の最初の引数として値を指定すると、Groongaがクラッシュする問題を修正しました。[GitHub#1045][yagisumiさんの報告]

感謝

  • yagisumiさん

9.0.8リリース - 2019-09-27

改良

  • [log_reopen] 2つ以上のワーカーで groonga-httpd を使用する場合の補足説明を追記しました。

  • 作成中のインデックスを無視するように改良しました。

    • インデックス構築中であっても、正しい検索結果を取得できます。

    • ただし、この場合、Groongaは検索にインデックスを使用しないため、検索は遅くなります。

  • [sub_filter] 対象のカラムのインデックスが作成中か、または、インデックスが無い時に sub_filter がシーケンシャルサーチを実行する機能を追加しました。

    • 以前のバージョンでは、上記の状態の場合、 sub_filter はエラーになりました。

    • 今回のバージョンから、 上記の状態でも sub_filter は検索結果を返します。

    • ただし、上記の状態の場合、 sub_filter は、シーケンシャルサーチで実行されるため遅いです。

  • [CentOS] CentOS 6の32-bitパッケージのサポートをやめました。

修正

  • [logical_range_filter] レコードが十分にあるとき、かつフィルター条件にマッチしないレコードが推定値を超えた時に、同じオブジェクトを2回閉じるという例外が発生する問題を修正しました。

9.0.7リリース - 2019-08-29

改良

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

    • CVE-2019-9511、CVE-2019-9513、CVE-2019-9516のセキュリティの修正が含まれています。

修正

  • ポスティングリストが巨大になった時にGroongaがクラッシュする問題を修正しました。

    • ただし、このバグは、一般的なデータでは殆ど発生しません。ポスティングリストは、一般的なデータでは、そこまで大きくならないためです。

  • 動的カラムのステージに initial を指定し、インデックスを使用した検索をすると空の結果を返す問題を修正しました。 [GitHub#683]

  • configure時にlibeditがインストールされているにもかかわらず、検知しない問題を修正しました。 [GitHub#1030][yuさんがパッチ提供]

  • --slices--sort_keys オプション使用時に --offset--limit オプションが動作しない問題を修正しました。 [clear-code/redmine_full_text_search#70][a9zawaさんの報告]

  • select コマンドの結果が巨大な時、検索結果が空になる問題を修正しました。[groonga-dev,04770][Yutaro Shimamuraさんの報告]

  • 前方一致検索や後方一致検索時に適切なインデックスを使わない問題を修正しました。[GitHub#1007, PGroonga#GitHub#96][oknjさんの報告]

感謝

  • oknjさん

  • Yutaro Shimamuraさん

  • yuさん

  • a9zawaさん

9.0.6リリース - 2019-08-05

改良

  • Debian 10 (buster)をサポートしました。

修正

  • [select] 検索エスカレーションが起こった際に検索がエラーになるバグを修正しました。

  • [select] ネストされた等価演算を使った際に、誤った検索結果を返すことがあるバグを修正しました。

  • [geo_distance_location_rectangle] load のフォーマットが誤っている例を修正しました。 [GitHub#1023] [yagisumiさんがパッチ提供]

  • [マイクロブログ検索システムの作成] 検索結果が誤っている例を修正しました。[GitHub#1024][yagisumiさんがパッチ提供]

感謝

  • yagisumiさん

9.0.5リリース - 2019-07-30

警告

このリリースには影響の大きい不具合があることがわかりました。select コマンドが誤った結果を返します。この問題を修正し、9.0.6をリリースする予定です。Groonga 9.0.5は使わず、後日リリースされる9.0.6を使ってください。問題の詳細については http://groonga.org/ja/blog/2019/07/30/groonga-9.0.5.html で解説しています。

改良

  • [logical_range_filter] 検索対象のシャードが十分に大きい時にのみ最適化を適用するように改良しました。

    • この機能は、ソートキーが同じ時にオフセット間で検索結果が重複するのを減らします。

    • 十分に大きいのしきい値はデフォルトで10000レコードです。

  • [ノーマライザー] NormalizerNFKC100 に新しいオプション unify_to_katakana を追加しました。

    • このオプションは、平仮名を片仮名にノーマライズします。

    • 例えば、 ゔぁゔぃゔゔぇゔぉヴァヴィヴヴェヴォ にノーマライズします。

  • [select] slicesパラメーターでdrilldownsをサポートしました。

  • [select] slicesパラメーターでcolumnsをサポートしました。

  • [select] initialステージ内でslicesパラメーターが _score を参照できるよう改良しました。

  • [highlight_html], [snippet_html] slicesパラメータ指定時に、slices実行前の式からもキーワードを抽出するように改良しました。

  • slicesパラメータ指定時に、slices実行前の式からもスコアーを収集するように改良しました。

  • ポスティングリストにポスティングを追加する際に自動的にスコアーを1増やすのをやめました。

    • grn_ii_posting_add は、この変更によって後方互換性がなくなりました。互換性を保つには、呼び出し側でスコアーを増やす必要があります。

  • XXX.YYY.ZZZ == AAA のようなネストされた等価演算のインデックス検索をサポートしました。

  • ハッシュテーブル使用時にハッシュの再構築の間隔を少なくしました。

    • この昨日によって、結果出力のパフォーマンスが改善します。

  • クエリーログにプレフィックスを追加できるようになりました。

    • どの条件のフィルターなのかわかりやすくなります。

  • Apache Arrow 1.0.0 をサポートしました。

    • ただし、このバージョンはまだ、リリースされていません。

  • Amazon Linux 2 をサポートしました。

修正

  • "[1, 2, 3]" のようなJSONのベクター値がインデックスされないバグを修正しました。

  • table_create のテストのパラメーター名が誤っていたバグを修正しました。[GitHub#1000][yagisumiさんがパッチ提供]

  • command_version=3 でdrilldownコマンドが実行された際に、ドリルダウンのラベルが空になるバグを修正しました。[GitHub#1001][yagisumiさんの報告]

  • MinGWでWindows版のパッケージのビルドが失敗するバグを修正しました。

  • MinGWのWindows版パッケージにCOPYINGがインストールされないバグを修正しました。

  • ハイライト対象として、クエリーにテキスト以外を指定した際に、キーワードがハイライトされないバグを修正しました。

  • [object_inspect] のMessagePack形式の出力が壊れるバグを修正しました。[GitHub#1009][yagisumiさんの報告]

  • index_column_diff のMessagePack形式の出力が壊れるバグを修正しました。[GitHub#1009][yagisumiさんの報告]

  • [suggest] のMessagePack形式の出力が壊れるバグを修正しました。[GitHub#1011][yagisumiさんの報告]

  • パトリシアトライのテーブルの検索時などにreallocのサイズが十分に確保されないバグを修正しました。[島津製作所さんの報告]

    • Groongaはこのバグでクラッシュする可能性があります。

  • groonga-release version 1.5.0より前から1.5.0-1へアップデートした際に groonga.repo が削除されるバグを修正しました。[groonga-talk:429][Josep Sanzさんの報告]

感謝

  • yagisumiさん

  • 島津製作所さん

  • Josep Sanzさん

9.0.4リリース - 2019-06-29

改良

  • 配列リテラルの複数要素をサポートしました。

  • ベクターの等価演算をサポートしました。

  • [logical_range_filter] 出力するクエリーログを追加しました。

    • logical_range_filter コマンドが、以下のタイミングでログを出力するようになります。

      • logical_range_filter によるフィルター後

      • logical_range_filter によるソート後

      • 動的カラム適用後

      • 結果出力後

    • この機能によって、このコマンドがどこまで完了したかを見ることができます。

  • [トークナイザー] TokenPattern の説明をドキュメントに追加しました。

  • [トークナイザー] TokenTable の説明をドキュメントに追加しました。

  • [トークナイザー] TokenNgram の説明をドキュメントに追加しました。

  • [grndb] groonga.logへの操作ログの出力を追加しました。

    • grndb コマンドが実行結果と実行過程を出力するようになります。

  • [grndb] 空のファイルのチェックをサポートしました。

    • この機能によって、空のファイルが存在するかどうかをチェックできます。

  • [grndb] 新しいオプション --since を追加しました。

    • 検査の範囲を指定できます。

  • [grndb] 新しいオプション --since についてのドキュメントを追加しました。

  • RapidJSONをバンドルしました。

    • 部分的にGroongaのJSONパーサーとしてRapidJSONを使うことができます。(この機能はまだ部分的です。)

    • これを使うことでより厳格なJSONのパースができます。

  • JSON文字列からint32のベクターへのキャストをサポートしました。

    • この機能は、RapidJSONが必要です。

  • [query] default_operator を追加しました。

    • "keyword1 keyword2"時の演算子をカスタマイズできます。

    • デフォルトでは、"keyword1 keyword2"はAND演算です。

    • "keyword1 keyword2"の演算子をAND以外に変更できます。

修正

  • [optimizer] 複数のfilter条件と xxx.yyy=="keyword" のような条件を指定した際にエラーが発生するバグを修正しました。

  • GroongaのWindows用のパッケージ(VC++版)に不足していたライセンスファイルを追加しました。

  • GroongaのWindows用のパッケージ(VC++版)UCRTランタイムを追加しました。

  • [ウィンドウ関数] メモリリークを修正しました。

    • これは、複数のウインドウに対してソートキーを適用した際に発生します。 [Takashi Hashidaさんがパッチ提供]

感謝

  • Takashi Hashidaさん

9.0.3リリース - 2019-05-29

改良

  • [select] より多くのクエリーログを追加しました。

    • select コマンドが、以下のタイミングでログを出力するようになります。

      • ドリルダウンによるソート後

      • ドリルダウンによるフィルター後

    • この機能によって、このコマンドがどこまで完了したかを見ることができます。

  • [logical_select] より多くのクエリーログを追加しました。

    • logical_select コマンドが、以下のタイミングでログを出力するようになります。

      • 動的カラム作成後

      • ドリルダウンによるグループ化後

      • ドリルダウンによるソート後

      • ドリルダウンによるフィルター後

      • logical_select によるソート後

    • この機能によって、このコマンドがどこまで完了したかを見ることができます。

  • [logical_select] limit オプションを使用したときのソートのパフォーマンスを少し改善しました。

  • [index_column_diff] パフォーマンスを改善しました。

    • このコマンドの実行速度を大幅に短くしました。

  • [index_column_diff] 無効な参照を無視するように改良しました。

  • [index_column_diff] ベクター要素の重複に対応しました。

  • [Normalizers] Unicode 12.1 の NFKC(Normalization Form Compatibility Composition)をベースにしたノーマライザー NormalizerNFKC121 を追加しました。

  • [TokenFilters] Unicode 12.1 の NFKC(Normalization Form Compatibility Composition)をベースにしたトークンフィルター NormalizerNFKC121 を追加しました。

  • [grndb] 新しいオプション --log-flags を追加しました。

    • groonga実行ファイルと同様、ログに出力する項目を指定できます。

    • サポートされているログフラグについては、[groonga 実行ファイル] を参照してください。

  • [snippet_html] 検索にマッチしない時の戻り値を変更する新しいオプションを追加しました。

  • [plugin_unregister] Windowsのフルパスをサポートしました。

  • 複数行のログメッセージをサポートしました。

    • この機能によって、複数行に渡るログメッセージが見やすくなります。

  • インデックスを使って検索した際、キーをGroongaのログに出力するようにしました。

  • [match_columnsパラメータ] インデックスの重みのドキュメントを追加しました。

  • [logical_range_filter] order パラメータの説明を追加しました。

  • [object_inspect] 新しい統計 INDEX_COLUMN_VALUE_STATISTICS_NEXT_PHYSICAL_SEGMENT_IDINDEX_COLUMN_VALUE_STATISTICS_N_PHYSICAL_SEGMENTS の説明を追加しました。

  • Ubuntu 14.04 のサポートをやめました。

修正

  • [index_column_diff] remains を多く報告するバグを修正しました。

  • --without-onigmo オプションを使った際にビルドエラーになるバグを修正しました。[GitHub#951] [Tomohiro KATOさんが報告]

  • "CVE: 2019-11675"の脆弱性を修正しました。[Wolfgang Hotwagnerさんが報告]

  • Windows版のGroongaにて、拡張パスプレフィックス \\?\ を削除しました。[GitHub#958] [yagisumiさんが報告]

    • この拡張プレフィックスは、プラグインを正確に見つけられないというバグを引き起こします。

感謝

  • Tomohiro KATOさん

  • Wolfgang Hotwagnerさん

  • yagisumiさん

9.0.2リリース - 2019-04-29

このリリースからVC++で作成したWindows版パッケージを提供します。

今までどおり、MinGWで作成したWindows版パッケージも提供しますが、近いうちにMinGWで作ったパッケージの代わりにVC++で作ったパッケージを提供する予定です。

改良

  • [column_create] 新しいフラグ INDEX_LARGE を追加しました。

    • このフラグによって、デフォルトの2倍の領域を持つインデックスカラムを作成できます。

    • ただ、メモリ使用量も2倍となることに注意して下さい。

    • このフラグは、インデックス対象のデータが大きい時に有用です。

    • 大きいデータとは、大量のレコード(通常は少なくとも1000万レコード以上)があり、少なくとも次のうちの1つ以上の特徴があります。

      • インデックス対象が複数のカラム

      • インデックステーブルにトークナイザーが付いている

  • [object_inspect] セグメントの新しい統計値 next_physical_segment_idmax_n_physical_segments を追加しました。

    • この情報で、インデックスカラムの領域の使用量とインデックスカラムの領域の最大値を確認できます。

  • [logical_select] シャードをまたがったウィンドウ関数をサポートしました。

  • [logical_range_filter] シャードをまたがったウインドウ関数をサポートしました。

  • [logical_count] シャードをまたがったウインドウ関数をサポートしました。

  • このリリースからVC++で作成したWindows版パッケージを提供するようにしました。

  • [io_flush] 新しいオプション --recursive dependent を追加しました。

    • 指定した書き出し対象オブジェクトとその子オブジェクトすべて、参照先のテーブル、インデックスが張られているカラムがある場合、対応するインデックスカラムとそのインデックスカラムのテーブルを書き出し対象オブジェクトにできます。

修正

  • 一部の環境でコンパイルエラー "unknown type name 'bool'" が発生する問題を修正しました。

  • mrubyを経由して実行するコマンド(例えば、 logical_selectlogical_range_filterlogical_count 等)で、Int32を超える数を正しく出力できない問題を修正しました。[GitHub#936] [HashidaTKSさんがパッチ提供]

感謝

  • HashidaTKSさん

9.0.1リリース - 2019-03-29

改良

  • ベクターの値にnullが使えるようになりました。

    • select ... --columns[vector].flags COLUMN_VECTOR --columns[vector].value "null" のように使用できます。

  • [dump] ドキュメントを英語に翻訳しました。

  • 無効なインデックスのチェックとログへの記録を強化しました。インデックス関連のバグを発見するのに役立ちます。

  • 8.0.6リリース - 2018-08-29GRN_TABLE_SELECT_ENOUGH_FILTERED_RATIO の説明を改善しました。

  • [select] 新しい引数 --load_table--load_columns--load_values を追加しました。

    • select の結果を --load_table で指定したテーブルへ格納できます。

    • --load_values オプションは、select の結果のカラムを指定します。

    • --load_columns オプションは、--load_table で指定したテーブルのカラムを指定します。

    • このようにして、--load_values で指定したカラムの値を、 --load_columns で指定したカラムへ格納できます。

  • [select] 新しい引数 --load_table--load_columns--load_values を追加しました。

  • [load] ロード先のテーブルをクエリーログに表示するようにしました。

    • 以下のように、ロード先のテーブル名は [] 内の文字列として表示します 。

    • :000000000000000 load(3): [LoadedLogs][3]

  • 以下のAPIを追加しました。

    • grn_ii_get_flags()

    • grn_index_column_diff()

    • grn_memory_get_usage()

  • 壊れたインデックスをチェックするためのコマンド index_column_diff を追加しました。コマンド実行の進捗を記録したい場合は、ログレベルをdebugに設定してください。

修正

  • [snippet_html] 一致しない場合、空のベクターを返すよう変更しました。

    • そのような場合、 null の代わりに空のベクター [] が返されます。

  • スレッドカウントがオーバフローする可能性についての警告を修正しました。実運用では、膨大な数のスレッドが使用されていないため、ユーザーに影響はありません。[GitHub#904]

  • maxOSでのビルドエラーを修正しました。 [GitHub#909] [shiro615さんが報告]

  • ストップワードの処理のバグを修正しました。

    • このバグは、クエリーの最初のトークンをストップワードとして設定すると発生します。

    • このバグが発生した場合、検索クエリーはヒットしません。

  • [全体設定] grn_lock_set_timeout のパラメーター名の誤字を修正しました。

  • インデックスの破損によって、削除されたレコードがマッチするバグを修正しました。

    • 大量のレコードを追加または、削除した時に発生することがあります。

  • logical_range_filter がレコードを返さない場合のメモリリークを修正しました。[GitHub#911] [HashidaTKSさんがパッチ提供]

  • ロードしているデータが正しくノーマライズされないことによってクエリーにマッチしないバグを修正しました。[PGroonga#GitHub#93, GitHub#912,GitHub#913] [kamicupさんとdodaisukeさんが報告]

    • このバグは、カタカナの後ろに空白のあるデータをロードし、ノーマライザーに unify_kana オプションが使用された時に発生します。

  • インデックスの更新中にインデックスが破損するバグを修正しました。

    • 長期間、大量のレコードの追加、削除を繰り返した時に発生することがあります。

  • インデックス更新時に十分な作業領域を確保できずにクラッシュするバクを修正しました。

感謝

  • shiro615さん

  • HashidaTKSさん

  • kamicupさん

  • dodaisukeさん

9.0.0リリース - 2019-02-09

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

改良

  • [トークナイザー] 新しいトークナイザー TokenPattern を追加しました。

    • 正規表現を使ってトークンを抽出できます。

      • このトークナイザーは正規表現にマッチしたトークンのみを抽出します。

    • 正規表現のパターンは複数指定できます。

  • [トークナイザー] 新しいトークナイザー TokenTable を追加しました。

    • 既存のテーブルのカラムの値を使ってトークンを抽出できます。

  • [dump] バイナリデータのダンプに対応しました。

  • [select] インデックスカラムに対する類似文書検索をサポートしました。

    • マルチカラムインデックスを使用している場合、この機能を使って、全てのソースカラムに対して類似文書検索ができます。

  • [ノーマライザー] NormalizerNFKC100 に新しいオプション remove_blank を追加しました。

    • このオプションは空白を取り除きます。

  • [groonga 実行ファイル] ログ内のThreadIDの表示を改善しました。

    • Windows版では、ProcessIDとThreadIDを混同しやすかったので、どちらがThreadIDでどちらがProcessIDかを明確にしました。

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

        • このフラグは、 nonedefault 以外の全てのフラグを指定します。

      • 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] トークンフィルターのオプションの出力をサポートしました。

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

  • [truncate] トークンフィルターのオプションを持ったテーブルをサポートしました。

    • TokenFilterStemTokenStopWord 等のようなオプションを持つトークナイザーを持つテーブルでも 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] デフォルトトークナイザーのオプションをサポートしました。

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

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

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

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

  • [トークナイザー][TokenMecab] TokenMecabtarget_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のメタデータの出力をサポートしました。

    • TokenMecabinclude_class オプションを追加しました。

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

    • TokenMecabinclude_reading オプションを追加しました。

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

    • TokenMecabinclude_form オプションを追加しました。

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

    • TokenMecabuse_reading オプションを追加しました。

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

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

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

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

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

  • [トークナイザー][TokenNgram] TokenNgramunify_alphabet オプションを追加しました。

    unify_alphabetfalse として使うと、 TokenNgram はASCII文字のトークナイズ方法にバイグラムを使います。

  • [トークナイザー][TokenNgram] TokenNgramunify_symbol オプションを追加しました。

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

  • [トークナイザー][TokenNgram] TokenNgramunify_digit オプションを追加しました。

    unify_digitfalse として使うと、 TokenNgram は数字のトークナイズ方法にバイグラムを使います。

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

修正

  • いくつかのケースでの誤ったスコア計算を修正しました。

    • ブール値に数値を加算、乗算または除算するときに発生します。

    • !=== を使ってスカラーとベクトルの列を比較するときに発生します。

8.0.6リリース - 2018-08-29

改良

  • [トークナイザー][TokenMecab] chunked_tokenizechunk_size_threshold の両オプションに対応しました。

  • [optimizer] query family expressionの推定に対応しました。column @ querycolumn @~ pattern のようなquery family expressionについて、より効果的な実行計画を立てられます。

  • [optimizer] オプティマイザをプラグインから組み込みの機能に変更し、初期状態で無効としました。環境変数を GRN_EXPR_OPTIMIZE=yes と定義するか、従来通りに expression_rewriters テーブルを使う事で機能を有効化できます。

  • 充分に絞り込み済みの場合において、初期状態でシーケンシャルサーチを行うようにしました。現在の結果が充分に少数である場合、シーケンシャルサーチはインデックス検索よりも高速です。現在の結果がテーブル内の全レコードの1%で1000件未満の場合、インデックス検索可能な場合であってもシーケンシャルサーチが使われます。

    現在、この最適化は、 ==><>=<= を使った検索時に適用されます。

    絞り込みに指定したカラムを持つテーブルのキーが ShortText の場合、この最適化を適用するためには、そのテーブルのノーマライザーを NormalizerAuto にする必要があります。

    この機能は環境変数で GRN_TABLE_SELECT_ENOUGH_FILTERED_RATIO=0.0 と設定する事で無効化できます。

  • [load] エラーメッセージにテーブル名を含めるようにしました。

  • [load] lock_table オプションを追加しました。--lock_table yes が指定された場合、カラムの更新と --each の適用を行っている間、load は対象のテーブルをロックします。このオプションは loaddelete の衝突を防ぎますが、読み込みの性能を低下させるでしょう。

  • [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_adjusterdrilldowns[LABEL].adjuster を追加しました。drilldown結果に対して、スコア調整できるようになります。

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

    GRN_II_REDUCE_EXPIRE_THRESHOLD=0 == GRN_II_REDUCE_EXPIRE_ENABLE=noGRN_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 )の代わりに NanInfinity-Infinity を使用するように改良しました。

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

  • 部分的に正規表現を用いた検索から、キーワードを抽出出来るように改良しました。これにより、正規表現を用いた検索に highlight_htmlsnippet_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] 動的カラムをサポートしました。 initialfiltered ステージのみをサポートしています。

  • [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] offsetlimit が複数のシャードに対して適用されたとき、実際よりも少ないレコードが返される不具合を修正しました。

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 実行前にリクエストがキャンセルされた場合、排他制御部分が未初期化となる場合がありました。その場合、クラッシュしていました。

  • [トークナイザー] トークナイザー名のドキュメントを修正しました。TokenBigramIgnoreBlankSplitSymbolAlphaTokenBigramIgnoreBlankSplitSymbolAlphaDigit であるべきでした。

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

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

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

    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_keysdrilldowns[${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] 別のユーザーでワーカーを動かしている時、 quitshutdown のレスポンスが壊れている問題を修正しました。 [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] columnsdrilldown の評価結果をクエリログに追加するようにしました。

  • [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_columnsquerydrilldown_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_flushload が同時に特定のタイミングで実行されるとクラッシュする不具合がありました。

  • [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 _sumcalc_types の指定なしに使っていた場合に問題が発生していました。 [GitHub#625] [村上さんがパッチ提供]

  • tokenizerでエラーが発生するとクラッシュする不具合を修正しました。tokenizer と token filterを登録していて、tokenizer にエラーがあると発生していました。

  • [window_record_number] ウィンドウ関数の引数が正しく渡されていない不具合を修正しました。 [GitHub#634] [村上さんがパッチ提供]

感謝

  • 村上さん

  • aomi-nさん

古いリリース