BloGroonga

2017-08-29

Groonga 7.0.6リリース

今日は肉の日ですね!

Groonga 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_flagsQUERY_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つがあります。

  • >
  • <
  • ~

例えば >GroongaGroonga のスコアをインクリメントします。<GroongaGroonga のスコアをデクリメントします。~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
    ]
  ]
]

さいごに

7.0.5からの詳細な変更点は7.0.6リリース 2017-08-29を確認してください。

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