BloGroonga

2021-06-29

Groonga 11.0.4リリース

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

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

変更内容

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

改良

  • [Normalizer] カスタマイズされたノーマライザーを使えるようになりました。

  • 新しいコマンド object_warm を追加しました。

    このコマンドは、GroongaのDBをOSのページキャッシュに乗せます。 OS起動後、Groongaを一度も起動していない場合、GroongaのDBはOSのページキャッシュ上に存在しません。 そのため、Groongaに対する最初の操作は遅くなります。

    予めこのコマンドを実行した場合、Groongaへの最初の操作は速くなります。 Linuxでは、 cat *.db > dev/null で同等のことができますが、Windowsでは、いままで同様のことはできませんでした。

    このコマンドを使うことで、LinuxでもWindowsでもGroongaのDBをOSのページキャッシュへ乗せることができます。 また、テーブル、カラム、インデックス単位でも同様のことができます。 したがって、よく使うテーブルやカラム、インデックスのみをOSのページキャッシュに乗せることができます。

  • select --filter 内で特定のレコードのスコアーを調整できるようにしました。

    *~ という演算子を使うことで、特定のレコードのスコアーを調整できます。 *~&&|| と同じ論理演算子です。したがって、 &&|| と同じように使えます。 *~ のデフォルトの重みは -1 です。

    したがって、例えば、 'content @ "Groonga" *~ content @ "Mroonga"' は以下の操作を意味します。

    1. 'content @ "Groonga"content @ "MySQL" にマッチしたレコードを抽出します。
    2. 以下のようにスコアーを追加します。
    a. 'content @ "Groonga"' のスコアーを計算します。
    b. 'content @ "Mroonga"' のスコアーを計算します。
    c. bのスコアーを -1 倍します。
    d. このレコードのスコアーは a + b です。したがって、 aのスコアー 1 で bのスコアーが1 の場合、
       このレコードのスコアーは 1 + (1 * -1) = 0 です。
    

    また、 *~${score_quantity} とすることで、スコアーの量を指定できます。

    具体的には、 以下の条件( 'content @ "Groonga" *~2.5 content @ "MySQL"' ) にマッチしたレコードのスコアーを調整します。

      table_create Memos TABLE_NO_KEY
      column_create Memos content COLUMN_SCALAR ShortText
    
      table_create Terms TABLE_PAT_KEY ShortText \
        --default_tokenizer TokenBigram \
        --normalizer NormalizerAuto
      column_create Terms index COLUMN_INDEX|WITH_POSITION Memos content
    
      load --table Memos
      [
      {"content": "Groonga is a full text search engine."},
      {"content": "Rroonga is the Ruby bindings of Groonga."},
      {"content": "Mroonga is a MySQL storage engine based of Groonga."}
      ]
    
      select Memos \
        --command_version 3 \
        --filter 'content @ "Groonga" *~2.5 content @ "Mroonga"' \
        --output_columns 'content, _score' \
        --sort_keys -_score,_id
      {
        "header": {
          "return_code": 0,
          "start_time": 1624605205.641078,
          "elapsed_time": 0.002965450286865234
        },
        "body": {
          "n_hits": 3,
          "columns": [
            {
              "name": "content",
              "type": "ShortText"
            },
            {
              "name": "_score",
              "type": "Float"
            }
          ],
          "records": [
            [
              "Groonga is a full text search engine.",
              1.0
            ],
            [
              "Rroonga is the Ruby bindings of Groonga.",
              1.0
            ],
            [
              "Mroonga is a MySQL storage engine based of Groonga.",
              -1.5
            ]
          ]
        }
      }
    

    adjuster を使っても同様のことができます。 adjuster を使う場合、アプリケーション上で、 --filter 条件と --adjuster 条件を作る必要がありますが、この改良で、 --filter 条件のみを作成すればよくなりました。

    以下のように、 query() を使って、filter条件を記述することもできます。

    • --filter 'content @ "Groonga" *~2.5 content @ "Mroonga"'
  • select 重み付き && をサポートしました。

    *<*> を使うことで、重み付きの && を使えます。 *< のデフォルトの重みは 0.5です。 *> のデフォルトの重みは 2.0 です。

    *<${score_quantity}*>${score_quantity} とすることで、スコアーの量を指定できます。 また、 *<${score_quantity} と指定した場合は、 ${score_quantity} の正負の符号が反転します。

    例えば、 'content @ "Groonga" *<2.5 query("content", "MySQL")' は以下の操作を意味します。

    1. 'content @ "Groonga"content @ "MySQL" にマッチしたレコードを抽出します。
    2. 以下のようにスコアーを追加します。
    a. 'content @ "Groonga"' のスコアーを計算します。
    b. 'query("content", "MySQL") のスコアーを計算します。
    c. bのスコアーは、 *< によって -2.5倍されます。
    d. このレコードのスコアーは a + b です。したがって、 aのスコアー 1 で bのスコアーが1 の場合、
       このレコードのスコアーは 1 + (1 * -2.5) = −1.5 です。
    

    具体的には、 以下の条件( 'content @ "Groonga" *~2.5 query("content", "MySQL")' ) にマッチしたレコードのスコアーを調整します。

      table_create Memos TABLE_NO_KEY
      column_create Memos content COLUMN_SCALAR ShortText
    
      table_create Terms TABLE_PAT_KEY ShortText \
        --default_tokenizer TokenBigram \
        --normalizer NormalizerAuto
      column_create Terms index COLUMN_INDEX|WITH_POSITION Memos content
    
      load --table Memos
      [
      {"content": "Groonga is a full text search engine."},
      {"content": "Rroonga is the Ruby bindings of Groonga."},
      {"content": "Mroonga is a MySQL storage engine based of Groonga."}
      ]
    
      select Memos \
        --command_version 3 \
        --filter 'content @ "Groonga" *<2.5 query("content", "Mroonga")' \
        --output_columns 'content, _score' \
        --sort_keys -_score,_id
      {
        "header": {
          "return_code": 0,
          "start_time": 1624605205.641078,
          "elapsed_time": 0.002965450286865234
        },
        "body": {
          "n_hits": 3,
          "columns": [
            {
              "name": "content",
              "type": "ShortText"
            },
            {
              "name": "_score",
              "type": "Float"
            }
          ],
          "records": [
            [
              "Groonga is a full text search engine.",
              1.0
            ],
            [
              "Rroonga is the Ruby bindings of Groonga.",
              1.0
            ],
            [
              "Mroonga is a MySQL storage engine based of Groonga.",
              -1.5
            ]
          ]
        }
      }
    
  • Log 標準出力、標準エラー出力への出力をサポートしました。

    プロセスログクエリーログ が標準出力と標準エラー出力への出力をサポートしました。

    • --log-path ---query-log-path - と指定した場合、Groongaはログを標準出力に出力します。
    • --log-path +--query-log-path + と指定した場合、Groongaはログを標準エラー出力に出力します。

    プロセスログ は、Groongaの動作全てに関することのログです。 クエリーログ は、クエリー処理に関することだけのログです。

    この機能はDocker上でGroongaを実行する際に有用です。 Dockerは標準で標準出力と標準エラー出力を記録する機能を持っています。したがって、Groongaのログを取得するために、 Dockerの環境にログインする必要がなくなります。

  • [ドキュメント] string_substring に不足している内容を追加しました。

既知の問題

  • 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。

  • [ブラウザーベースの管理ツール] 現在Groongaには、レコード一覧の管理モードのチェックボックスにチェックを入れても、 非管理モードに入力された検索クエリーが送信されるという問題があります。

  • *<*> は、filter条件の右辺に query() を使う時のみ有効です。もし、以下のように指定した場合、 *<*>&& として機能します。

    • 'content @ "Groonga" *< content @ "Mroonga"'

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 11.0.4リリース

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