BloGroonga

2019-02-09

Groonga 9.0.0リリース

Groonga 9.0.0をリリースしました! メジャーバージョンアップです! メジャーバージョンアップですが、互換性は壊れていないので、データベースを再構築することなく9.0.0へアップグレードできます。

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

変更内容

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

  • Tokenizers 新しいトークナイザー TokenPattern を追加しました。

  • Tokenizers 新しいトークナイザー TokenTable を追加しました。

  • select インデックスカラムに対する類似文書検索をサポートしました。

  • Normalizers NormalizerNFKC100 に新しいオプション remove_blank を追加しました。

  • groonga実行ファイル ログ内のThread IDの表示を改善しました。

Tokenizers 新しいトークナイザー TokenPattern を追加しました。

以下のように正規表現を使ってトークンを抽出できます。 このトークナイザーは、正規表現にマッチしたトークンのみを抽出します。

正規表現は複数指定することもできます。

tokenize 'TokenPattern("pattern", "\\\\d+円", "pattern", "りんご|みかん")' "私は100円のりんごと50円のみかんを129円で買いました。"
[
  [
    0,
    0.0,
    0.0
  ],
  [
    {
      "value": "100円",
      "position": 0,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "りんご",
      "position": 1,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "50円",
      "position": 2,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "みかん",
      "position": 3,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "129円",
      "position": 4,
      "force_prefix": false,
      "force_prefix_search": false
    }
  ]
]

Tokenizers 新しいトークナイザー TokenTable を追加しました。

以下のように、既に存在するテーブルのキーを使ってトークンを抽出できます。

table_create Keywords TABLE_PAT_KEY ShortText --normalizer NormalizerNFKC100
load --table Keywords
[
{"_key": "100円"},
{"_key": "りんご"},
{"_key": "29円"}
]
tokenize 'TokenTable("table", "Keywords")' "私は100円のりんごを29円で買いました。"
[
  [
    0,
    0.0,
    0.0
  ],
  [
    {
      "value": "100円",
      "position": 0,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "りんご",
      "position": 1,
      "force_prefix": false,
      "force_prefix_search": false
    },
    {
      "value": "29円",
      "position": 2,
      "force_prefix": false,
      "force_prefix_search": false
    }
  ]
]

select インデックスカラムに対する類似文書検索をサポートしました。

マルチカラムインデックスを使っている場合、この機能を使って全てのソースカラムに対して類似文書検索ができます。

table_create Documents TABLE_HASH_KEY ShortText
column_create Documents content1 COLUMN_SCALAR Text
column_create Documents content2 COLUMN_SCALAR Text
table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
column_create Terms document_index COLUMN_INDEX|WITH_POSITION|WITH_SECTION Documents content1,content2
load --table Documents
[
["_key", "content1"],
["groonga の概要", "groonga は転置索引を用いた高速・高精度な全文検索エンジンであり、登録された文書をすぐに検索結果に反映できます。"],
["全文検索と即時更新", "一般的なデータベースにおいては、追加・削除などの操作がすぐに反映されます。一方、全文検索においては、転置索引が逐次更新の難しいデータ構造であることから、文書の追加・削除に対応しないエンジンが少なくありません。"],
["カラムストアと集計クエリ", "現代は、インターネットを情報源とすれば、いくらでも情報を収集できる時代です。"]
]
load --table Documents
[
["_key", "content2"],
["転置索引とトークナイザ", "転置索引は大規模な全文検索に用いられる伝統的なデータ構造です"],
["共有可能なストレージと参照ロックフリー", "CPU のマルチコア化が進んでいるため、同時に複数のクエリを実行したり、一つのクエリを複数のスレッドで実行したりすることの重要性はますます高まっています。"],
["位置情報(緯度・経度)検索", "GPS に代表される測位システムを搭載した高機能な携帯端末の普及などによって、位置情報を扱うサービスはますます便利になっています。"],
["groonga ライブラリ", "Groonga の基本機能は C ライブラリとして提供されているので、任意のアプリケーションに組み込んで利用することができます。"],
["groonga サーバ", "groonga にはサーバ機能があるため、レンタルサーバなどの新しいライブラリをインストールできない環境においても利用できます。"],
["groonga ストレージエンジン", "groonga は独自のカラムストアを持つ列指向のデータベースとしての側面を持っていますが、既存の RDBMS のストレージエンジンとして利用することもできます。"]
]
select Documents --filter 'Terms.document_index *S "MySQLで全文検索"' --output_columns '_key, _score, content1, content2'
[
  [
    0,
    1549608674.553312,
    0.0007221698760986328
  ],
  [
    [
      [
        3
      ],
      [
        [
          "_key",
          "ShortText"
        ],
        [
          "_score",
          "Int32"
        ],
        [
          "content1",
          "Text"
        ],
        [
          "content2",
          "Text"
        ]
      ],
      [
        "groonga の概要",
        419432,
        "groonga は転置索引を用いた高速・高精度な全文検索エンジンであり、登録された文書をすぐに検索結果に反映できます。",
        ""
      ],
      [
        "全文検索と即時更新",
        209716,
        "一般的なデータベースにおいては、追加・削除などの操作がすぐに反映されます。一方、全文検索においては、転置索引が逐次更新の難しいデータ構造であることから、文書の追加・削除に対応しないエンジンが少なくありません。",
        ""
      ],
      [
        "転置索引とトークナイザ",
        209716,
        "",
        "転置索引は大規模な全文検索に用いられる伝統的なデータ構造です"
      ]
    ]
  ]
]

Normalizers NormalizerNFKC100 に新しいオプション remove_blank を追加しました。

このオプションは、以下のように、空白を取り除きます。

normalize 'NormalizerNFKC100("remove_blank", true)' "This is a pen."
[
  [
    0,
    1549528178.608151,
    0.0002171993255615234
  ],
  {
    "normalized": "thisisapen.",
    "types": [
    ],
    "checks": [
    ]
  }
]

groonga実行ファイル ログ内のThread IDの表示を改善しました。

Windows版にて、Process ID とThread ID が区別しにくかったため、どちらが、Thread ID またはProcess ID なのかを明確にしました。

  • (Before): |2436|1032:
    • 2436 がProcess IDです。 1032 がThread IDです。
  • (After): |2436|00001032:
    • 2436 がProcess IDです。 00001032 がThread IDです。

さいごに

8.1.1からの詳細な変更点は9.0.0リリース 2019-02-09を確認してください。

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

2019-01-29

Groonga 8.1.1リリース

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

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

お知らせ

株式会社セナネットワークス様が、メーリングリスト(groonga-dev)と Groonga・Mroonga・PGroongaのサイトを検索するサービスを作ってくれました!

Sagroonga(さぐるんが)と言います。 PGroonga使って作ってあります。

Groonga・Mroonga・PGroongaのサイトの右上に検索ボックスをつけてあります。 その検索ボックスで検索すると、このSagroongaを使って検索するようになっています。

ぜひご活用ください!

変更内容

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

  • logical_select 新しい引数 --load_table--load_columns--load_values を追加しました。

  • groonga実行ファイル 新しいオプション --log-flags を追加しました。

  • インデックスの更新エラー発生時にメモリリークする問題を修正しました。

  • ノーマライザー ステートレスなノーマライザーとステートフルなノーマライザーを同時に使用した時に、それらが誤った結果を返すバグを修正しました。

    • ステートレスなノーマライザーとは、以下です。

      • unify_kana
      • unify_kana_case
      • unify_kana_voiced_sound_mark
      • unify_hyphen
      • unify_prolonged_sound_mark
      • unify_hyphen_and_prolonged_sound_mark
      • unify_middle_dot
    • ステートフルなノーマライザーとは、以下です。

      • unify_katakana_v_sounds
      • unify_katakana_bu_sound
      • unify_to_romaji

logical_select 新しい引数 --load_table--load_columns--load_values を追加しました。

logical_select の結果を --load_table で指定したテーブルへ格納できます。

--load_values オプションは、 logical_select の結果のカラムを指定します。

--load_columns オプションは、 --load_table で指定したテーブルのカラムを指定します。

このようにして、--load_values で指定したカラムの値を、 --load_columns で指定したカラムへ格納できます。

例えば以下のように、 --load_table で指定したLogsテーブルに logical_select の結果の_idtimestamp を格納できます。

table_create Logs_20150203 TABLE_HASH_KEY ShortText
column_create Logs_20150203 timestamp COLUMN_SCALAR Time

table_create Logs_20150204 TABLE_HASH_KEY ShortText
column_create Logs_20150204 timestamp COLUMN_SCALAR Time

table_create Logs TABLE_HASH_KEY ShortText
column_create Logs original_id COLUMN_SCALAR UInt32
column_create Logs timestamp_text COLUMN_SCALAR ShortText

load --table Logs_20150203
[
{
  "_key": "2015-02-03:1",
  "timestamp": "2015-02-03 10:49:00"
},
{
  "_key": "2015-02-03:2",
  "timestamp": "2015-02-03 12:49:00"
}
]

load --table Logs_20150204
[
{
  "_key": "2015-02-04:1",
  "timestamp": "2015-02-04 00:00:00"
}
]

logical_select \
  --logical_table Logs \
  --shard_key timestamp \
  --load_table Logs \
  --load_columns "original_id, timestamp_text" \
  --load_values "_id, timestamp"
[
  [
    0,
    0.0,
    0.0
  ],
  [
    [
      [
        3
      ],
      [
        [
          "_id",
          "UInt32"
        ],
        [
          "_key",
          "ShortText"
        ],
        [
          "timestamp",
          "Time"
        ]
      ],
      [
        1,
        "2015-02-03:1",
        1422928140.0
      ],
      [
        2,
        "2015-02-03:2",
        1422935340.0
      ],
      [
        1,
        "2015-02-04:1",
        1422975600.0
      ]
    ]
  ]
]
select --table Logs
[
  [
    0,
    0.0,
    0.0
  ],
  [
    [
      [
        3
      ],
      [
        [
          "_id",
          "UInt32"
        ],
        [
          "_key",
          "ShortText"
        ],
        [
          "original_id",
          "UInt32"
        ],
        [
          "timestamp_text",
          "ShortText"
        ]
      ],
      [
        1,
        "2015-02-03:1",
        1,
        "1422928140000000"
      ],
      [
        2,
        "2015-02-03:2",
        2,
        "1422935340000000"
      ],
      [
        3,
        "2015-02-04:1",
        1,
        "1422975600000000"
      ]
    ]
  ]
]

groonga実行ファイル 新しいオプション --log-flags を追加しました。

Groongaのログに出力する項目を指定できます。

以下のような項目を出力できます。

  • タイムスタンプ
  • ログメッセージ
  • ロケーション(ログが出力された場所)
  • プロセスID
  • スレッドID

以下のように接頭辞を指定できます。

  • +

    • この接頭辞は、"フラグを追加する"という意味です。
  • -

    • この接頭辞は、"フラグを削除する"という意味です。
  • 接頭辞無しは、"存在するフラグを置き換える"という意味です。

具体的には、以下のようにフラグを指定できます。

  • none

    • ログに何も出力しません。
  • time

    • ログにタイムスタンプを出力します。
  • message

    • ログにメッセージを出力します。
  • location

    • ログの出力場所(ファイル名、行数、関数名)とプロセスIDを出力します。
  • process_id

    • ログにプロセスIDを出力します。
  • pid

    • このフラグは、 process_id のエイリアスです。
  • thread_id

    • ログにスレッドIDをを出力します。
  • all

    • このフラグは、 nonedefault フラグ以外の全てのフラグを指定します。
  • default

    • ログにタイムスタンプとメッセージを出力します。

| を使って、複数のログフラグを指定することもできます。

例えば以下のように、プロセスIDとスレッドIDを追加で出力できます。

実行コマンド
% groonga --log-path groonga.log --log-flags "+pid|+thread_id" db/test.db

結果のフォーマット
Timestamp|Log level|process id|thread id: Log message

結果
2019-01-29 08:53:03.587000|n|2344|3228: grn_init: <8.1.1-xx-xxxxxxxx>

さいごに

8.1.0からの詳細な変更点は8.1.1リリース 2019-01-29を確認してください。

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

2018-12-29

Groonga 8.1.0リリース

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

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

変更内容

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

  • io_flush コマンド実行後に、DBに対するアンロックが常にフラッシュの実行後になってしまうバグを修正しました。
    • いずれアンロック情報をOSがストレージへフラッシュしますが、OSがフラッシュする前にGroongaが終了された場合は、DBにロックが残ります。
    • この問題は、WindowsOSでのみ発生します。
  • 参照先を持たないレコードを持つテーブルに対して reindex コマンドを実行した際に、 reindex コマンドが終了しないバグを修正しました。

さいごに

8.0.9からの詳細な変更点は8.1.0リリース 2018-12-29を確認してください。

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

2018-11-29

Groonga 8.0.9リリース

肉の日ですね。Groonga 8.0.9をリリースしました!

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

変更内容

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

トークナイザーのTokenDelimitが空白文字以外でも区切ってトークナイズできるようになりました

TokenDelimit で任意の区切り文字を指定するための新たなオプションとして delimiterpattern が追加されました。例:

% groonga
> tokenize 'TokenDelimit("delimiter", ",")' "A,B"
=> "A", "B"
> tokenize 'TokenDelimit("delimiter", ",")' "A , B"
=> "A ", " B" (空白文字が残っている)
> tokenize 'TokenDelimit("pattern", "\\\\s*,\\\\s*")' "A, B  ,C"
=> "A", "B", "C"

2番目の例のように、delimiter オプションで指定されなかった文字は区切り文字として扱われない事に注意して下さい。 3番目の例のように一定しない空白文字を含む入力に対しては、区切りを正規表現で指定できる pattern オプションが便利でしょう。

ノーマライザートークンフィルターの、主に国際化関連での複数の改善

ノーマライザーの NormalizerNFKC100 が、新しいオプション unify_to_romaji によるひらがな・カタカナからローマ字への変換に対応しました。例:

% groonga
> normalize 'NormalizerNFKC100("unify_to_romaji", true)' "リンゴ みかん"
=> "ringo mikan"

また、新たな組み込みのトークンフィルターとして TokenFilterNFKC100 も追加されました。 このトークンフィルターはノーマライザーの NormalizerNFKC100 と同様に、unify_kana オプションによってカタカナからひらがなへの変換を行えます。例:

% groonga
> tokenize TokenMecab "リンゴおいしい" --token_filters TokenFilterNFKC100
=> "リンゴ", "おいしい" ("リンゴ" が全角にノーマライズされたのみ)
> tokenize TokenMecab "リンゴおいしい" --token_filters 'TokenFilterNFKC100("unify_kana", true)'
=> "りんご", "おいしい" ("リンゴ" が全角且つひらがなにノーマライズされている)

トークンフィルターの TokenFilterStem では、新たに追加された algorithm オプションによって英語以外の言語(フランス語、スペイン語、ポルトガル語、イタリア語、ルーマニア語、ドイツ語、オランダ語、スウェーデン語、ノルウェー語、デンマーク語、ロシア語、フィンランド語)のステミングを行えるようになりました。 具体的な使い方はこのオプションの自動テストを参照して下さい。

トークンフィルターの TokenFilterStopWord では、新たに追加された column オプションによって、is_stop_word 以外の任意の名前のカラムをストップワードの明示に使えるようになりました。 具体的な使い方はこのオプションの自動テストを参照して下さい。

さいごに

8.0.8からの詳細な変更点は8.0.9リリース 2018-11-29を確認してください。

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

2018-10-29

Groonga 8.0.8リリース

肉の日ですね。Groonga 8.0.8をリリースしました!

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

変更内容

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

  • トークナイザーのTokenMecabに新しいオプションを追加しました。
  • io_flush中のデータベースのロックをサポートしました。

トークナイザーのTokenMecabに新しいオプションを追加しました

TokenMecabtarget_class オプションが加わりました。

target_class オプションは、指定した品詞のトークンを検索します。 このオプションは、サブクラスの指定や +- を使って特定の品詞を追加、除外することもできます。

  • + は、検索対象の品詞を追加します。
    • + または、`` のみを指定した場合は、全てのトークンが検索対象になります。
  • - は、検索対象から品詞を除外します。

例えば、以下のように代名詞を除く全てのトークンを検索できます。

'TokenMecab("target_class", "-名詞/代名詞", "target_class", "+")'

io_flush 中のデータベースのロックをサポートしました。

この機能は、io_flush中にio_flush対象のテーブルを削除するとGroongaがクラッシュするバグを修正するために追加しました。io_flushは、フラッシュ中にGroongaのデータベースをロックします。そのため、io_flush中は以下のコマンドは実行できません。

  • column_create
  • column_remove
  • column_rename
  • logical_table_remove
  • object_remove
  • plugin_register
  • plugin_unregister
  • table_create
  • table_remove
  • table_rename

さいごに

8.0.7からの詳細な変更点は8.0.8リリース 2018-10-29を確認してください。

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