HAYASHI Kentaro
hayas****@clear*****
2015年 3月 29日 (日) 14:22:14 JST
今日は肉の日(3/29)ですね。Groonga 5.0.1をリリースしました! http://groonga.org/ja/docs/news.html#release-5-0-1 それぞれの環境毎のインストール方法はこちらを見てください。 http://groonga.org/ja/docs/install.html 今回のリリースの主なトピックは次の通りです。 * [非互換] スコアに関連したDB APIの非互換な変更があります * [実験的] 正規表現をサポート * スコア関数をカスタマイズできるようになりました * [windows] ディスク使用量を削減しました * [実験的] 頻出トークンとレアトークンを同時に検索したときの高速化 今回のリリースでは、DB API層に非互換な変更があります。 Groongaをライブラリとして使っている人は、この影響を受けます。 selectコマンドを使って検索するぶんには影響はありません。 ## [非互換] スコアに関連したDB APIの非互換な変更があります 今回のリリースではDB API層に非互換な変更がはいりました。 以下の2点を修正する必要があります。 * 内部で使っている_scoreの型の変更に追従する * grn_search_optargを0で初期化する 新旧のGroongaで正しく動作するようにするには次のように_scoreの 型変更に対応したコードに修正してください。 grn_obj *score; double score_value; if (score->header.domain == GRN_DB_FLOAT) { score_value = GRN_FLOAT_VALUE(score); } else { score_value = (double)GRN_INT32_VALUE_FLOAT_VALUE(score); } また、grn_search_optargを次のように0で初期化してください。 grn_search_optarg options; memset(&options, 0, sizeof(grn_search_optarg)); すでに上記のようにしているなら、リビルドしなおす(ABIの変更に追従)だけ です。 ## [実験的] 正規表現をサポート 今回のリリースでは、正規表現を使った検索をサポートしました。 select コマンドの query オプションと filter オプションで正規表現を使え ます。注意しないといけないのは、query と filterとでは構文がちょっと違 うことです。 queryの場合: ${COLUMN}:~${REGULAR_EXPRESSION} filterの場合: ${COLUMN} @~ ${REGULAR_EXPRESSION} 「:~」と「@~」の違いは、Groongaの設計の違いによるものです。 queryはクエリー構文を記述するのに対して、filterにはスクリプト構文を記 述する必要があります。 この構文の違いはfilterのほうが複雑な条件を記述できるように設計されたため です。 インデックスを使って高速に検索することもできます。 そのためには、次の条件を満すインデックスを作成します。 * 語彙表は TABLE_PAT_KEY テーブルであること。 * 語彙表は TokenRegexp トークナイザーを使っていること。 * インデックスカラムは WITH_POSITION フラグ付きであること。 つまり、次のようなカラムインデックスを作成します。 table_create RegexpLexicon TABLE_PAT_KEY ShortText \ --default_tokenizer TokenRegexp \ --normalizer NormalizerAuto column_create RegexpLexicon logs_message_index \ COLUMN_INDEX|WITH_POSITION Logs message こうすることで、上記の例だとmessageカラムをインデックスを使って 正規表現による検索をすることができるようになります。 詳細については正規表現のドキュメントを参照してください。 http://groonga.org/ja/docs/reference/regular_expression.html ## スコア関数をカスタマイズできるようになりました 今回のリリースでは、スコア関数をカスタマイズできるようになりました。 組み込みのスコア関数は2つあります。 * scorer_tf_idf "重要な単語"の出現頻度が高いほどスコアが高くなる * scorer_tf_at_most マッチすればするほどスコアが高くなるが、一定値を越えない ようにする Groongaは標準でTF(マッチすればするほどスコアが高くなる)を採用していま す。 例えば、titleとmessageというように複数のカラムに対して検索するケースを 考えてみましょう。 messageの内容をもっともよく表すタイトルをtitleにつけるので、titleのほ うに重みをつけるとします。そうすることでより重要なものが上位にくるよう にできますが、messageカラムでマッチ数が多いとその順位が逆転してしまう ということがありえます。 scorer_tf_at_mostを使うと、たくさんマッチしても最大値はこの値までとい うように制限することができるます。 そのため、頻出語で検索したときにtitleには含まれていないけど、messageカ ラムにはたくさん含まれているので検索の上位にきてしまうということがな いようにできます。 スコアラーの詳細については次のドキュメントを参照してください。 http://groonga.org/ja/docs/reference/scorer.html ## [windows] ディスク使用量を削減しました 今回のリリースでは、データベースの初期サイズを小さくし、ディスク使用量 を削減する仕組みをデフォルトで有効にしました。これはGroonga 4.1.1では いった実験的な機能を正式に採用したものです。 これまで、WindowsではGNU/Linuxとは異なりかなりサイズが大きい初期ファイル (128MiB)をデフォルトで使っていました。 このデータベースファイルはカラムを作れば作るだけ増えていくので、登録し ているデータが少ない場合にはかなり無駄な領域があることになります。 これはあまり嬉しくないので、WindowsでもGNU/Linux環境と同じように必要に 応じて追加していくようにデフォルトの挙動を変更したのが今回の変更です。 以下のメールに詳しいことが書いてあります。 [groonga-dev,03036] Windowsでの動作確認のお願い http://sourceforge.jp/projects/groonga/lists/archive/dev/2014-December/003038.html ongaeshiさんがテストに協力してくれました。ありがとうございます! この変更により、後方互換性(新しいGroongaで古いGroongaのデータベースを 開ける)は保たれますが、前方互換性(古いGroongaで新しいGroongaのデータベー スを開ける)は失われていることに注意してください。 ## [実験的] 頻出トークンとレアトークンを同時に検索したときの高速化 今回のリリースでは、 頻出トークンとレアトークンを同時に検索したときの 検索を高速に行えるようになりました。「同時に」というのがポイントです。 この機能はデフォルトでは無効です。 この機能を有効にするには、次の環境変数を指定する必要があります。 GRN_II_CURSOR_SET_MIN_ENABLE=1 注意事項として、ある程度のサイズの文書量がないと改善の効果を体感できな いというのがあります。 この機能の詳細についてはメーリングリストの次の投稿を参照してください。 http://sourceforge.jp/projects/groonga/lists/archive/dev/2015-February/003097.html 期待通りに改善している報告があつまったらデフォルトで有効にします。 ## 変更点 さて、5.0.0からの変更点は以下の通りです。 http://groonga.org/ja/docs/news.html#release-5-0-1 改良 * [logical_range_filter] filterとsortをサポートしました。 * マルチカラムインデックスを使った指定範囲の検索をサポートしました。 * Groongaをライブラリとして使う人向けにAPIの 概要 を追加しました。 * [非互換] 内部で使っている _score の型を 32bit整数値から浮動小数点 に変更しました。この変更はGroongaのDB APIを使っているユーザーにとっ て非互換な変更です。クエリAPIを使っているユーザーには影響ありませ ん。つまり、select を使っているだけなら影響ないということです。新 旧のバージョンのGroongaで動作するようにするには次のコードを使いま す: grn_obj *score; double score_value; if (score->header.domain == GRN_DB_FLOAT) { score_value = GRN_FLOAT_VALUE(score); } else { score_value = (double)GRN_INT32_VALUE_FLOAT_VALUE(score); } * [select] ドリルダウンの引数の誤りをより厳密にチェックするようにしました。 * grn_ctx_get_all_tables() を追加しました。 [Masatoshi Teruyaさんが提案] * スコア関数のカスタマイズをサポートしました。詳細は Scorer を参照してください。 * [非互換] スコア関数の導入により、DB API層でAPIとABIの互換性がなく なりました。grn_search_optarg を使っていたら、次のようなコードで grn_search_optarg を 0 で初期化しているかチェックしてください。: grn_search_optarg options; memset(&options, 0, sizeof(grn_search_optarg)); 上記のようにしていれば、あなたの書いたコードはAPIの互換性があり、 ABIは互換性がない状態です。単にそのままリビルドしてください。コー ドの修正は不要です。もしあなたの書いたコードが上記のようにしていな いなら、上記のコードを追加してください。 * DB APIに grn_obj の型をチェックするための叙述関数を追加しました。 * grn_obj_is_table() * grn_obj_is_proc_proc() * grn_obj_is_function_proc() * grn_obj_is_selector_proc() * grn_obj_is_scorer_proc() * [実験的] ポスティングリストをスキップできるようにしました。頻出語 とほとんど出現しない語が同時に検索されたときにスキップできます。こ れにより検索の速度を改善できます。この機能を有効にするには GRN_II_CURSOR_SET_MIN_ENABLE 環境変数を 1 にします。デフォルトでは 無効です。 * [doc] in_values のドキュメントを追加しました。 * logical_count のドキュメントを追加しました。 * [mruby] #inspect メソッドを実装しました。デバッグに有用です。 * スコアラー scorer_tf_at_most のドキュメントを追加しました。出現頻度 が高くても、指定したスコアの閾値を越えないようにします。 * [mruby] マッチする件数を推定してインデックスを使って検索するかシー ケンシャルに検索するかを選択できるようにしました。 * インデックスを使ってサイズを推定するための関数を追加しました。 * grn_expr_estimate_size() * grn_ii_estimate_size_for_query() * grn_ii_estimate_size_for_lexicon_cursor() * NormalizerAuto が利用できるかのチェックを追加しました。[GitHub#283] [末永さんが報告] * Visual Studio 2010のサポートをやめました。 * [実験的][mecab] チャンクに分割してトークナイズできるようにしました。 この機能は MeCabの "too long sentense" エラーの回避策です。有効に するには GRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を yes に設定 します。この設定により、Groonga は長いテキスト (デフォルトでは 8192 バイトを越えるテキスト)を小さなチャンクと呼ばれるかたまりに分 割してMeCabへと渡します。この処理により、上記のエラーが発生しない ようになります。さらに、このチャンクの閾値は GRN_MECAB_CHUNK_SIZE_THRESHOLD 環境変数でカスタマイズできます。,, ., !, ?, U+3001 IDEOGRAPHIC COMMA, U+3002 IDEOGRAPHIC FULL STOP, U+FF01 FULLWIDTH EXCLAMATION MARK と U+FF1F FULLWIDTH QUESTION MARK がチャンクの区切り文字として扱われます。 * groongaコマンド のサーバーモードで --pid-file をサポートしました。 * [groonga-httpd] Groongaを緩やかに停止することができるようにしまし た。コネクションを即座に強制終了しないようになります。 * [実験的] 正規表現をサポートしました。正規表現の使いかたについては 正規表現のドキュメントを参照してください。 * [実験的] plugin_unregister コマンドを追加しました。 * [http][load] "," をPOSTデータの区切り文字として使うようにしました。 これにより、内部のバッファサイズが小さくて済むので、POSTデータに一 切改行がない場合にロード時間を短縮できます。 * [doc] トークナイザー のドキュメントを追加しました。 * POSIX.2 との互換性を改善しました。. bashの "source" コマンドのかわり に . を使うようにしました。[GitHub#317] [栗山さんがパッチ提供] * [windows] デフォルトのIOバージョンを1に変更しました。これにより Windowsでディスク容量を削減できます。[groonga-dev,03118] [ongaeshi さんがテスト] * [httpd] バンドルしているnginxのバージョンを1.7.11に更新しました。 * TSV出力時のMIMEタイプを text/plain から text/tab-separated-values に変更しました。 * [TokenFilterStopWord] 静的なインデックス構築方法 をサポートしまし た。[GitHub#296] [村上さんがパッチ提供] 修正 * 非推奨の --address 引数をGroongaのデフォルト設定ファイル (groonga.conf)で使わないようにしました。かわりに --bind-address を 使います。 [Groonga-talk] [Dewanggaさんが報告] * [truncate] キーが TABLE_NO_KEY なテーブルでtruncateができない問題 を修正しました。 * [mecab] 不必要な "empty token" や "ignore empty token" といったロ グが出力されないようにしました。 * 誤ったインデックスのセクションが使われてしまう不具合を修正しました。 これにより誤った検索結果を返していました。次の条件をすべて満すと発 生します。 * 複数のインデックスが張られている * 最初に定義したインデックスか最後に定義したインデックスがマルチカラム インデックスを使っている * 最初に定義したインデックスと最後に定義したインデックスがマルチ カラムインデックスだったとき、そのソースカラムの指定順が異なっ ている * シェルのコマンドラインからGroongaのコマンドを groongaコマンド に渡 すと常に 0 を終了コードとして返す不具合を修正しました。 例えば、 groonga DB_PATH 存在しないコマンド名 を実行しても終了コードとして 0 を常に返します。 * 2つ以上のプラグインを登録しているときにプラグインのパスが壊れてし まう不具合を修正しました。 [村上さんが報告] * match_columns に Lexicon.index.source_column_name を指定しても動作 しない不具合を修正しました。source_column_name として指定されたカ ラムが2つ以上のインデックスをもつ場合に発生します。 [村上さんが報 告] 感謝 * Masatoshi Teruyaさん * 末永さん * Dewanggaさん * 栗山さん * ongaeshiさん * 村上さん -- HAYASHI Kentaro <hayas****@clear*****>