[groonga-dev,04451] [ANN] Groonga 7.0.6

Back to archive index

Kentaro Hayashi hayas****@clear*****
2017年 8月 29日 (火) 15:06:10 JST


今日は肉の日ですね。

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

  http://groonga.org/ja/blog/2017/08/29/groonga-7.0.6.html

細かな変更点についてはニュースをご確認下さい。

  http://groonga.org/ja/docs/news.html#release-7-0-6

それでは、今月のリリースについて紹介します。

# 変更内容

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

  * object_inspect コマンドを使ってディスク使用量を表示できるようになりました
  * クエリーをパースする際にフォールバックする機能をサポートしました
  * クエリー内の語のスコアを調整できるようになりました

## object_inspect コマンドを使ってディスク使用量を表示できるようになりました

今回のリリースでは、object_inspect コマンドを使ってディスク使用量を表
示できるようになりました。

これまでも、データベース全体のディスク容量はduコマンドなどを使えばわか
ります。しかし、特定のオブジェクト(例えば、テーブルだったり、インデッ
クスなど)がどれくらいディスクを使用しているかというのは、簡単にはわか
りませんでした。(できなくはないですが、オブジェクトと対応するパスを調
べて突き合わせたりしないといけないので一手間かかります。)

今回のリリースからは、そのような面倒なことをしなくてもよくなりました。
object_inspect コマンドのレスポンスに disk_usage パラメータが含まれる
ようになっています。 使用量の確認には、そのパラメータを参照してくださ
い。単位はバイトです。

例えば、チュートリアルのサンプルで作ったデータベースのディスク使用量を調べてみましょう。

  table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText
  column_create --table Site --name title --type ShortText
  load --table Site
  [
  {"_key":"http://example.org/","title":"This is test record 1!"},
  {"_key":"http://example.net/","title":"test record 2."},
  {"_key":"http://example.com/","title":"test test record three."},
  {"_key":"http://example.net/afr","title":"test record four."},
  {"_key":"http://example.org/aba","title":"test test test record five."},
  {"_key":"http://example.com/rab","title":"test test test test record six."},
  {"_key":"http://example.net/atv","title":"test test test record seven."},
  {"_key":"http://example.org/gat","title":"test test record eight."},
  {"_key":"http://example.com/vdw","title":"test test record nine."},
  ]
  table_create --name Terms --flags TABLE_PAT_KEY --key_type ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
  column_create --table Terms --name blog_title --flags COLUMN_INDEX|WITH_POSITION --type Site --source title

Terms テーブルのディスク使用量を調べるには次のコマンドを実行します。

  object_inspect --output_pretty yes Terms

すると次のような結果が得られます。

  {
    "id": 258,
    "name": "Terms",
    "type": {
      "id": 49,
      "name": "table:pat_key"
    },
    "key": {
      "type": {
        "id": 14,
        "name": "ShortText",
        "type": {
          "id": 32,
          "name": "type"
        },
        "size": 4096
      },
      "total_size": 21,
      "max_total_size": 4294967294
    },
    "value": {
      "type": null
    },
    "n_records": 15,
    "disk_usage": 8437760
  }

ディスク使用量は、"disk_usage": 8437760 であることがわかります。

今度はインデックスカラムのディスク使用量を調べてみましょう。 Terms テー
ブルの blog_title カラムのディスク使用量を調べるには次のコマンドを実行
します。

  object_inspect --output_pretty yes Terms.blog_title

すると次のような結果が得られます。

  {
    "id": 259,
    "name": "blog_title",
    "table": {
      "id": 258,
      "name": "Terms",
      "type": {
        "id": 49,
        "name": "table:pat_key"
      },
    (省略)
    ],
    "disk_usage": 5283840
  }

すると、ディスク使用量は、"disk_usage": 5283840 であることがわかります。

## クエリーをパースする際にフォールバックする機能をサポートしました

今回のリリースでは、クエリーをパースする際にフォールバックする機能をサ
ポートしました。 従来エラー扱いにしていたクエリーであってもエラーには
ならなくなります。Groongaを使って開発しているアプリケーションで、ユー
ザーからの入力そのままに検索したいような場合に使うと便利です。

この機能を有効にするには、query_flags に QUERY_NO_SYNTAX_ERROR を指定します。

例えば、雑誌名のタイトルを検索するサンプルを考えてみます。

  table_create --name Magazine --flags TABLE_HASH_KEY --key_type ShortText
  column_create --table Magazine --name title --type ShortText
  load --table Magazine
  [
  {"_key":"http://gihyo.jp/magazine/wdpress","title":"WEB+DB PRESS"},
  {"_key":"http://gihyo.jp/magazine/SD","title":"Software Design"},
  ]
  table_create --name Terms --flags TABLE_PAT_KEY --key_type ShortText \
    --default_tokenizer TokenBigram --normalizer NormalizerAuto
  column_create --table Terms --name title \
    --flags COLUMN_INDEX|WITH_POSITION --type Magazine --source title

このデータベースに対して、WEB + で検索してみましょう。

  select Magazine --output_pretty yes --query 'WEB +' --match_columns title"

すると構文エラーとなります。

  [
    [
      -63,
      1503902587.063566,
      0.0007965564727783203,
      "Syntax error: <WEB +||>",
      [
        [
          "yy_syntax_error",
          "grn_ecmascript.lemon",
          37
        ]
      ]
    ]
  ]

では、次は QUERY_NO_SYNTAX_ERROR をつけて実行してみましょう。

  select Magazine --output_pretty yes \
    --match_columns title \
    --query 'WEB +'  \
    --query_flags ALLOW_PRAGMA|ALLOW_COLUMN|QUERY_NO_SYNTAX_ERROR

すると次のようにエラーにならずに結果が得られます。

  [
    [
      0,
      1503902343.382929,
      0.0419621467590332
    ],
    [
      [
        [
          1
        ],
        [
          [
            "_id",
            "UInt32"
          ],
          [
            "_key",
            "ShortText"
          ],
          [
            "title",
            "ShortText"
          ]
        ],
        [
          1,
          "http://gihyo.jp/magazine/wdpress",
          "WEB+DB PRESS"
        ]
      ]
    ]
  ]

QUERY_NO_SYNTAX_ERROR フラグをつけることで、WEB と + というキーワード
とみなしてそれらが含まれるタイトルを検索する、という意味だと解釈します。
そのため構文エラーにならないのです。

## クエリー内の語のスコアを調整できるようになりました

今回のリリースでは、クエリー内の語のスコアを調整できるようになりました。

これまで、検索結果に対し、特定のカラムのスコアをあげて調整するというこ
とはできましたが、キーワード単位でスコアを上げたり、下げたりというとい
うのはサポートしていませんでした。今回のリリースからはキーワード単位で
スコアを微調整することが可能になります。

スコアの調整方法は次の3つがあります。

* >
* <
* ~

例えば >Groonga は Groonga のスコアをインクリメントします。<Groonga は
Groonga のスコアをデクリメントします。~Groonga は検索結果についてマッ
チしたドキュメントのスコアをデクリメントします。~ は検索結果そのものに
は影響しません。

実際にこれらスコアの調整方法を使ったサンプルを示します。

  table_create --name Shops --flags TABLE_NO_KEY
  column_create --table Shops --name keyword --type ShortText
  load --table Shops
  [
  {"keyword":"居酒屋 洋食"},
  {"keyword":"居酒屋 和食 "},
  {"keyword":"居酒屋 中華"},
  {"keyword":"カフェ 洋食"},
  ]

  table_create --name Terms --flags TABLE_PAT_KEY \
    --key_type ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
  column_create --table Terms --name keyword \
    --flags COLUMN_INDEX|WITH_POSITION --type Shops --source keyword

このデータベースに対して、居酒屋 で検索してみましょう。

  select Shops --output_pretty yes \
    --match_columns keyword --output_columns keyword,_score --sort_keys -_score \
    --query '居酒屋'

すると次のような結果が返ってきます。

  [
    [
      [
        3
      ],
      [
        [
          "keyword",
          "ShortText"
        ],
        [
          "_score",
          "Int32"
        ]
      ],
      [
        "居酒屋 洋食",
        1
      ],
      [
        "居酒屋 中華",
        1
      ],
      [
        "居酒屋 和食",
        1
      ]
    ]
  ]

keyword に居酒屋を含むデータはすべてスコアが1になっています。

では、和食 が上位にくるように>を使ってスコアを調整してみましょう。

  select Shops --output_pretty yes --match_columns keyword \
    --output_columns keyword,_score --sort_keys -_score \
    --query '居酒屋 (>和食 OR 洋食 OR 中華)'

  [
    [
      [
        3
      ],
      [
        [
          "keyword",
          "ShortText"
        ],
        [
          "_score",
          "Int32"
        ]
      ],
      [
        "居酒屋 和食 ",
        8
      ],
      [
        "居酒屋 中華",
        2
      ],
      [
        "居酒屋 洋食",
        2
      ]
    ]
  ]

これで 和食 を含む場合にスコアが高くなりました。

今度は < を使って 洋食 を 中華 よりもスコアをあげてみましょう。

  select Shops --output_pretty yes --match_columns keyword \
    --output_columns keyword,_score --sort_keys -_score \
    --query '居酒屋 (>和食 OR <洋食 OR 中華)'

これで 洋食 が 中華 よりも高いスコアとなりました。

  [
    [
      [
        3
      ],
      [
        [
          "keyword",
          "ShortText"
        ],
        [
          "_score",
          "Int32"
        ]
      ],
      [
        "居酒屋 和食 ",
        8
      ],
      [
        "居酒屋 洋食",
        7
      ],
      [
        "居酒屋 中華",
        2
      ]
    ]
  ]

## 改良

* 前方一致検索を複数インデックスを指定してできるようになりました。 (例
  --query "Foo*" --match_columns
  "TITLE_INDEX_COLUMN||BODY_INDEX_COLUMN")

* [window_count] window_count 関数を追加しました。検索した結果にカウン
  トした値を追加するのに使います。検索結果をもとに分析したり、カウント
  結果をもとにフィルタしたりすると便利です。

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

  * grn_obj_get_disk_usage() を追加。
  * GRN_EXPR_QUERY_NO_SYNTAX_ERROR を追加。
  * grn_expr_syntax_expand_query_by_table() を追加。
  * grn_table_find_reference_object() を追加。

* [object_inspect] 指定したオブジェクトのディスク使用量を表示できるよ
  うになりました。

* クエリーをパースする際にフォールバックする機能をサポートしました。
  QUERY_NO_SYNTAX_ERROR フラグが query_flags に指定されていると有効に
  なります。(標準では無効です) このフラグが設定されていると、シンタッ
  クスエラーが発生しなくなります。例えば、"A +" というクエリーは自動的
  にエスケープされて "A +" という扱いになります。この振る舞いはアプリ
  ケーションがユーザーの入力をそのまま検索語句として使い、シンタックス
  エラーやログに記録されないようにしたい場合に便利です。

* クエリー内の語のスコアを調整できるようになりました。">", "<" と "~"
  がサポートされています。例えば ">Groonga" は "Groonga" のスコアをイ
  ンクリメントします。"<Groonga" は "Groonga" のスコアをデクリメントし
  ます。"~Groonga" は検索結果についてマッチしたドキュメントのスコアを
  デクリメントします。"~" は検索結果そのものには影響しません。

* テーブルを削除するときのパフォーマンスを改善しました。
  thread_limit=1 する必要はありません。参照されているテーブルが存在す
  るかチェックする処理をオブジェクトを開かなくてもできるようにしました。
  その結果としてパフォーマンスが改善しました。

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

## 修正

* [dump] 7番目の引数 ( --sort_hash_table )が名前無しだと無視される不具
  合を修正しました。



--
Kentaro Hayashi <hayas****@clear*****>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: 無し
型:         application/pgp-signature
サイズ:     833 バイト
説明:       無し
Télécharger 



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