BloGroonga

2020-09-29

Groonga 10.0.7リリース

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

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

変更内容

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

  • [highlight], [highlight_full] ノーマライザーにオプションを指定できるようになりました。

  • return code 新しいリターンコード GRN_CONNECTION_RESET を追加しました。

    • このリターンコードは、リモートホストから強制的に接続を切断されたときに返されます。
  • Ubuntu 19.10(Eoan Ermine)のサポートをやめました。

    • このバージョンはEOLになっているためです。
  • [httpd] バンドルしているnginxのバージョンを1.19.2に更新しました。

  • grndb キーの重複を検出できるようになりました。

    • 今回のリリースから、 grndb check でキーの重複も検出できるようになりました。
    • このチェックは、 TABLE_NO_KEY のテーブル以外で有効です。
    • grndb check で重複が検出されたテーブルにインデックスカラムしかない場合は、 grndb recover で復旧できます。
  • [table_create], [column_create] 新しいオプション --path を追加しました。

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

  • 新しい関数 string_toknize() を追加しました。

    • この関数は、第二引数に指定されたカラムの値を、第一引数に指定されたトークナイザーでトークナイズします。
  • [tokenizer] 新しいトークナイザー TokenDocumentVectorTFIDF を追加しました。(実験的)

    • このトークナイザーは、TF-IDFで文書ベクトルを自動で生成します。
  • [tokenizer] 新しいトークナイザー TokenDocumentVectorBM25 を追加しました。(実験的)

    • このトークナイザーは、BM25で文書ベクトルを自動で生成します。
  • [select] 同一センテンス内での、近傍検索をサポートしました。

  • 257個のカラムに対して load を実行すると load の応答が返らなくなる問題を修正しました。

    • この問題は、10.0.4以降で発生する可能性があります。
    • この問題は、 [a, b, c, ...] の形式でデータをロードした時にのみ発生します。
      • [{...}] を使ってデータをロードした場合は発生しません。
  • [MessagePack] float32の値を正しくアンパックできない問題を修正しました。

  • マルチカラムインデックス関連の問題を修正しました。

    • _score の値が壊れることがあります。
    • ヒットしないはずのレコードがヒットすることがあります。

[highlight], highlight_full ノーマライザーにオプションを指定できるようになりました

  • highlight()highlight_full() にノーマライザーのオプションを指定できるようになりました。
  • 設定可能なオプションについては、以下を参照してください。

    • https://groonga.org/ja/docs/reference/normalizers/normalizer_nfkc100.html#parameters
  • 例えば、 unify_hyphen を使ってコードポイントの異なるハイフンを同一視できます。

    table_create Entries TABLE_NO_KEY
    column_create Entries body COLUMN_SCALAR ShortText
    
    load --table Entries
    [
    {"body": "full-text-search. Use U+002D HYPHEN-MINUS"},
    {"body": "full֊text֊search. Use U+058A ARMENIAN HYPHEN"},
    {"body": "full˗text˗search. Use U+02D7 MODIFIER LETTER MINUS SIGN"}
    ]
    
    select Entries --output_columns \
      'highlight_full(body, \
                      "NormalizerNFKC121(\\"unify_hyphen\\", true)", \
                      true, \
                      "full-text-search", \
                      "<span class=\\"keyword1\\">", \
                      "</span>")' --output-pretty yes
    [
      [
        0,
        0.0,
        0.0
      ],
      [
        [
          [
            3
          ],
          [
            [
    	  "highlight_full",
    	  null
    	]
          ],
          [
            "<span class=\"keyword1\">full-text-search</span>. Use U+002D HYPHEN-MINUS"
          ],
          [
            "<span class=\"keyword1\">full֊text֊search</span>. Use U+058A ARMENIAN HYPHEN"
          ],
          [
            "<span class=\"keyword1\">full˗text˗search</span>. Use U+02D7 MODIFIER LETTER MINUS SIGN"
          ]
        ]
      ]
    ]
    
  • unify_hyphen オプションを指定しない場合、 以下のように {"body": "full-text-search. Use U+002D HYPHEN-MINUS"} のみハイライトされます。

    • その他のレコードは、検索キーワードに含まれるハイフンとコードポイントが異なるためです。
    select Entries --output_columns \
      'highlight_full(body, \
                      "NormalizerNFKC121()", \
                      true, \
                      "full-text-search", \
                      "<span class=\\"keyword1\\">", \
                      "</span>")'
    [
      [
        0,
        0.0,
        0.0
      ],
      [
        [
          [
        3
      ],
      [
        [
          "highlight_full",
          null
        ]
      ],
      [
        "<span class=\"keyword1\">full-text-search</span>. Use U+002D HYPHEN-MINUS"
      ],
      [
        "full֊text֊search. Use U+058A ARMENIAN HYPHEN"
      ],
      [
        "full˗text˗search. Use U+02D7 MODIFIER LETTER MINUS SIGN"
      ]
        ]
      ]
    ]
    

table_create, column_create 新しいオプション --path を追加しました。

  • このオプションによって指定したテーブルまたは、カラムを任意のパスに格納できます。

  • このオプションは、高速なストレージ(SSDなど)によく使うテーブルやカラムを格納し、低速なストレージ(HDDなど)にあまり使わないテーブルやカラムを格納したいときに有用です。

  • このオプションは、相対パス、絶対パスの両方が指定できます。

    • 相対パスを指定した場合は、 groonga プロセスのパスを起点に指定したパスが解決されます。
  • --path を指定した場合、 dump コマンドの結果に --path の情報が含まれます。

    • したがって、 --path を指定した場合、 異なる環境のホストではリストアできなくなります。
    • --path の情報を dump に含みたくない場合は、 dump コマンド実行時に --dump_paths no を指定する必要があります。

dump 新しいオプション --dump_paths を追加しました。

  • --dump_paths オプションは --path をダンプするかどうかを制御します。

  • デフォルト値は、 yes です。

  • もし、テーブルやカラム作成時に --path を指定していて、 --path の情報を dump に含みたくない場合は、 dump コマンド実行時に --dump_pathsno を指定してください。

  • 従来の近傍検索では、同一センテンス内での検索はできませんでした。
  • 今回のリリースから同一センテンス内での検索ができます。

    table_create Memos TABLE_PAT_KEY ShortText
    column_create Memos content COLUMN_SCALAR ShortText
    
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto
    column_create Terms memos_content COLUMN_INDEX|WITH_POSITION Memos content
    
    load --table Memos
    [
    {"_key":"alphabets1", "content": "a c d ."},
    {"_key":"alphabets2", "content": "a b c d e f ."},
    {"_key":"alphabets3", "content": "a b x c d e f ."},
    {"_key":"alphabets4", "content": "a b x x c d e f ."}
    ]
    
    select \
      --table Memos \
      --match_columns content \
      --query '*NP3,-1"a c .$"' \
      --output_columns _score,_key,content
    [
      [
        0,
        0.0,
        0.0
      ],
      [
        [
          [
            2
          ],
          [
            [
              "_score",
              "Int32"
            ],
            [
              "_key",
              "ShortText"
            ],
            [
              "content",
              "ShortText"
            ]
          ],
          [
            1,
            "alphabets1",
            "a c d ."
          ],
          [
            1,
            "alphabets2",
            "a b x c ."
          ]
        ]
      ]
    ]
    
  • 同一センテンス内の近傍検索は、以下の構文を使います。

    • '"NP${MAX_INTERVAL},${ADDITIONAL_LAST_INTERVAL}"'${FIRST_PHRASE},${LASR_PHRASE} ${SEPARATOR}$

      • ${ADDITIONAL_LAST_INTERVAL}-1 を指定した場合、最初のフレーズと最後のフレーズの間隔が ${MAX_INTERVAL} 以下のレコードがヒットします。

        • このケースでは、最後のフレーズとセパレーターがどれほど離れていてもレコードはヒットします。
      • ${ADDITIONAL_LAST_INTERVAL}1 以上の整数を指定した場合は、 以下の条件のレコードがヒットします。

        • 最初のフレーズと最後のフレーズの間隔が ${MAX_INTERVAL} 以下。
        • 最初のフレーズとセパレーターの間隔が ${MAX_INTERVAL}+${ADDITIONAL_LAST_INTERVAL} 以下。
      • ${ADDITIONAL_LAST_INTERVAL}0 を指定した場合、近傍検索は従来の動作をします。

        • ${ADDITIONAL_LAST_INTERVAL} のデフォルト値は 0 です。
    • ${SEPARATOR} には任意の文字を指定できます。

マルチカラムインデックス関連の問題を修正しました。

  • _score が壊れることがあります。
  • ヒットしないはずのレコードがヒットすることがあります。

  • 例えば、以下のクエリを実行するとこの問題が発生します。

    select TABLE \
      --match_columns 'LEXICON.INDEX[10]' \
      --query 'XXX' \
      --output_columns _score
    
    • このケースでは、 LEXICON.INDEX[0] - LEXICON.INDEX[9] が未初期化でした。

      • Groongaは、検索対象のインデックスを各セクションの値が 0 かどうかで決定しています。
      • したがって、 LEXICON.INDEX[0] - LEXICON.INDEX[9] が未初期化の場合、Groongaは誤った検索対象を選択する可能性があります。

        • LEXICON.INDEX[0] - LEXICON.INDEX[9] の値が不定なためです。
      • また、 これらの値は、スコアの重みに使われます。

        • そのため、 _score の値も不定になります。
  • ただ、以下のクエリーでは、この問題は発生しません。未初期化の領域が発生しないためです。

    select TABLE \
      --match_columns 'LEXICON.INDEX[0]' \
      --query 'XXX' \
      --output_columns _score
    
  • つまり、以下のような場合にこの問題が発生します。

    • ソースカラムに abc を持つマルチカラムインデックスがある時、以下のようにセクションを指定している場合。

      • ac
      • bc
      • b のみ
      • c のみ
  • 以下の条件ではこの問題は発生しません。未初期化の領域が発生しないためです。

    • 以下のように最初のセクションから途中間を空けずに指定している場合は発生しません。

      • abc
      • ab
      • a のみ

さいごに

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

2020-08-29

Groonga 10.0.6リリース

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

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

変更内容

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

  • 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 コマンドはパッケージングに共通のエラーをチェックするためのコマンドです。
      • インストール方法についての詳細は、以下も参照してください。

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

  • 値を持たない配列を削除した時、そのレコードのIDを再利用するようにしました。

    • 値を持たない配列を削除した場合、削除されたIDは再利用されません。
    • Groongaは大きなIDがあることによって、多くのストレージを使用します。大きなIDはそれだけで、多くのストレージを使うためです。

      • 大きなIDは、例えば、Mroongaの mroonga_operations のように多くの追加と削除によって発生します。
  • select インデックスを設定していない全文検索のパフォーマンスを改善しました。

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

  • インデックス構築 トークンカラムを使った静的インデックス構築のパフォーマンスを改善しました。

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

    • _score の値が "_score = func(...)" のように関数によってのみ算出される場合のパフォーマンスを改善しました。
  • 応答送信のエラーが発生した後の応答にゴミが含まれることがある問題を修正しました。

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

logical_select highlight_htmlhighlight_full をサポートしました。

  • highlight_htmlhighlight_full は、今まで select--output-columns でしか使えませんでしたが、 今回のリリースから、以下のように logical_select でも使えるようになりました。

    plugin_register sharding
    plugin_register functions/number
    
    table_create Memos_20170315 TABLE_NO_KEY
    column_create Memos_20170315 timestamp COLUMN_SCALAR Time
    column_create Memos_20170315 content COLUMN_SCALAR Text
    
    table_create Memos_20170316 TABLE_NO_KEY
    column_create Memos_20170316 timestamp COLUMN_SCALAR Time
    column_create Memos_20170316 content COLUMN_SCALAR Text
    
    table_create Memos_20170317 TABLE_NO_KEY
    column_create Memos_20170317 timestamp COLUMN_SCALAR Time
    column_create Memos_20170317 content COLUMN_SCALAR Text
    
    load --table Memos_20170315
    [
    {"timestamp": "2017/03/15 00:00:00", "content": "Groonga is fast."},
    {"timestamp": "2017/03/15 01:00:00", "content": "Mroonga is fast and easy to use."}
    ]
    
    load --table Memos_20170316
    [
    {"timestamp": "2017/03/16 10:00:00", "content": "PGroonga is fast and easy to use."},
    {"timestamp": "2017/03/16 11:00:00", "content": "Rroonga is fast and easy to use."}
    ]
    
    logical_select Memos \
      --shard_key timestamp \
      --query 'content:@easy' \
      --output_columns 'content, highlight_html(content)'
    [
      [
        0,
        0.0,
        0.0
      ],
      [
        [
          [
            3
          ],
          [
            [
              "content",
              "Text"
            ],
            [
              "highlight_html",
              null
            ]
          ],
          [
            "Mroonga is fast and easy to use.",
            "Mroonga is fast and <span class=\"keyword\">easy</span> to use."
          ],
          [
            "PGroonga is fast and easy to use.",
            "PGroonga is fast and <span class=\"keyword\">easy</span> to use."
          ],
          [
            "Rroonga is fast and easy to use.",
            "Rroonga is fast and <span class=\"keyword\">easy</span> to use."
          ]
        ]
      ]
    ]
    

さいごに

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

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

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