BloGroonga

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