BloGroonga

2020-07-30

Groonga 10.0.5リリース

Groonga 10.0.5をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

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

  • select ソートのパフォーマンスを改善しました。

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

    • 沢山のレコードがマッチする検索をしているケース。
    • 沢山のレコードに対してドリルダウンするケース。
  • [aggregator] score アクセサーをサポートしました。

  • インデックス構築 VC++版の静的インデックス構築のパフォーマンスを改善しました。

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

    • これらの値はJSONではサポートされていないためです。
  • select 標準偏差の集計をサポートしました。

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

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

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

    • これは、Apache Arrow形式を使っている時にのみ発生します。
    • 前のリクエストがエラーによって中断された後に再度Groongaへリクエストを送信した時にGroongaがクラッシュします。
  • between 一時テーブルを使用した時にクラッシュする問題を修正しました。

    • 例えば、 between の第一引数に動的カラムを指定すると、Groongaがクラッシュしていました。
  • プラグインで作成したプロシージャーが予期せず解放される問題を修正しました。

    • 参照カウントモードでのみ発生します。
    • plugin_register を使っていない場合は、発生しません。
    • plugin_register を実行したプロセスでは発生しません。
    • plugin_register を実行していないプロセスで発生します。
  • token_column を使った静的インデックス構築中に正規化エラーが発生する問題を修正しました。

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 はこの改善をサポートしていません。

[aggregator] score アクセサーをサポートしました。

  • 例えば、 以下のように _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
            ]
          ]
        }
      ]
    ]
    

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",p
            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}) と指定することで、不偏標準偏差も計算できます。

さいごに

それでは、Groongaでガンガン検索してください!