[groonga-dev,04870] [ANN] Groonga 11.0.4

Back to archive index
Horimoto Yasuhiro horim****@clear*****
2021年 6月 29日 (火) 16:49:51 JST


こんにちは。堀本です。

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

    https://groonga.org/ja/docs/news.html#release-11-0-4

変更点一覧:

    https://groonga.org/ja/blog/2021/06/29/groonga-11.0.4.html

## 主な変更内容

* [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"'



groonga-dev メーリングリストの案内
Back to archive index