BloGroonga

2020-06-29

Groonga 10.0.4リリース

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

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

変更内容

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

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

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

    • Groongaは、検索結果が検索対象の時に、 _score の値を再帰的に取得します。
    • 例えば、 slices は検索結果が検索対象です。したがって、 slices を使っているクエリーでは、今回前は効果がありません。
  • log ドリルダウンのキーをクエリーログに出力するようにしました。

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

    • 短い間隔で複数の load を呼び出す必要がある場合、参照カウントモードによる自動クローズによってパフォーマンスが低下します。
    • 複数の load の前に reference_acquire を呼び、複数の load の後に reference_release を呼ぶことで、このパフォーマンスの低下を避けることができます。 reference_acquirereference_release の間は自動クローズは無効になります。

      • reference_acquire が、対象のオブジェクトの参照を取得するためです。
    • パフォーマンスに影響のある操作が完了したら、 reference_release を呼ぶ必要があります。

      • reference_release を呼ばない場合、参照カウントモードは機能しません。
  • select 一度の drilldown で複数のグループ集計をサポートしました。

  • groonga実行ファイル スタンドアローンモードで、 --pid-path をサポートしました。

    • 以前のバージョンのスタンドアローンモードでは、 --pid-path は無視されていました。
  • io_flush 参照カウントモードに対応しました。

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

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

    • 最後のチャンクの後のヘッダーを無視するHTTPクライアントが存在する可能性があるためです。
  • [vector_slice] Float32 型のベクターをサポートしました。

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

    • 予めトークナイズされたデータから複数スレッドで静的インデックスの構築ができるようになりました。
    • 以下の環境変数で、並列静的インデックス構築を調整できます。

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

        • デフォルト値は 1024 レコードです。
      • GRN_TOKEN_COLUMN_PARALLEL_TABLE_SIZE_THRESHOLD: どのくらいのソースレコードで並列化するか。

        • デフォルト値は 102400 レコードです。
  • select 参照カウントモード時の load_table のパフォーマンスを改善しました。

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

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

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

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でガンガン検索してください!

2020-05-29

Groonga 10.0.3リリース

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

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

変更内容

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

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

  • select 関数の引数に vector を指定できるようになりました。

  • select 動的カラムに新しいステージ result_set を追加しました。

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

      • queryfilter が存在しない場合は、結果セットのテーブルが作られないためです。
    • このステージでは _value は使用できません。 result_set ステージの値は score_column に格納されます。

  • [vector_slice] 重み付きベクターの重みに Float32 型が使えるようになりました。

  • select drilldowns の動的カラムのステージに filteredoutput を追加しました。

    • drilldowns[Label].stage filtereddrilldowns[Label].stage output のように drilldowns の動的カラムのステージに filteredoutput を使えます。
  • select ドリルダウンでの集計に Float 型の値をサポートしました。

    • MAXMINSUM を使って Float 型の値の最大値、最小値、合計値を集計できます。
  • querygeo_in_rectanglegeo_in_circle query()geo_in_rectangle()geo_in_circle() に新しいオプション score_column を追加しました。

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

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

    • 10.0.3から、Windows 8 (Windows Server 2012) 以降を要求します。
  • select 参照可能なソートキーとそうでないソートキーが混在しているときのソートパフォーマンスを改善しました。

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

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

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

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

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

  • [ベクターカラム] 重み付きベクターの重みに float32 型を追加しました。

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

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

    • 10.0.3から Float32 の値の精度は、 8桁から7桁になります。
  • 動的カラムのパラメーターだけが違うクエリーが実行された時にGroongaが誤ったキャッシュを使用していた問題を修正しました。

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

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

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

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

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

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

    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 を指定できるようになりました。

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

    select \
      --table Memos \
      --filter 'query("content", "-content:@mroonga", \
                      { \
                        "expander": "QueryExpanderTSV", \
                        "flags": ["ALLOW_LEADING_NOT", "ALLOW_COLUMN"] \
                      })'
    

querygeo_in_rectanglegeo_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 を使うことで、中心座標からの距離でソートできます。

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

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

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

    • 圧縮されたカラム
    • ドリルダウンのキーに複数の値が指定されているドリルダウンの値を格納する _value
    • ShortText 型のキーを持たないパトリシアトライテーブルの _key
    • _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 フラグと併用できません。

さいごに

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

2020-04-29

Groonga 10.0.2リリース

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

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

変更内容

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

  • time_classify_* 関数が uvector に対応しました。

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

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

  • Data type Float32 型をサポートしました。

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

    • grn_obj_unref(grn_ctx *ctx, grn_obj *obj)
    • grn_get_version_major(void)
    • grn_get_version_minor(void)
    • grn_get_version_micro(void)
    • 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)

修正

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

  • 関係のないカラムの値をクリアーしてしまう問題を修正しました。

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

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

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

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

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

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

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

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

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

さいごに

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

2020-03-30

Groonga 10.0.1リリース

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

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

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

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

変更内容

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

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

さいごに

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

2020-03-29

Groonga 10.0.0リリース

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

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

変更内容

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

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

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

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

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

    • 以下のようなログが出力されます。

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

    • 以下のようなログが出力されます。

      [io][open] file_path
      [io][close] file_path
      
  • 以下の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からの詳細な変更点は10.0.0リリース 2020-03-29を確認してください。

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