HAYASHI Kentaro
hayas****@clear*****
2012年 9月 29日 (土) 18:07:14 JST
林です。 今日は肉の日ですね。 groonga 2.0.7をリリースしました! groonga2.0.7はgroonga 2.xのメンテナンスリリースです。 http://groonga.org/ja/docs/news.html#release-2-0-7 今回のリリースの主なトピックは 3つあります。 * groonga-httpdでのPOSTによるloadコマンドのサポート * サーバーパッケージ構成と使用ポートの見直し * min/max関数のサポート それぞれの環境毎のインストール方法はこちらを見てください。 http://groonga.org/ja/docs/install.html ○ groonga-httpdでのPOSTによるloadコマンドのサポート 今回のリリースでは、POSTによるloadコマンドの実行をサポートしました。 実際の例を以下に示します。 サンプルで使うスキーマ定義: table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText column_create --table Site --name title --type ShortText http://localhost:10041/にアクセスするとブラウザベースの管理ツールを 使って上記スキーマ定義のSiteテーブルおよびtitleカラムを簡単に作成する ことができます。 テーブルとカラムを作り終えたら、次にSiteテーブルへと登録しておきたいレコードをJSON形 式で用意します。(例としてファイル名はpostbody.txtとします。) ----postbody.txtの内容ここから---- [ {"_key": "site1", "title":"Web site1 title"} ] ----postbody.txtの内容ここまで---- 登録データが準備できたので、curlコマンドを使ってPOSTリクエストをサーバーへと投げてみます。 % curl -X POST 'http://localhost:10041/d/load?table=Site' \ --verbose -H 'Content-Type: application/json' -d****@postb***** 実行すると以下のような結果が得られます。 * About to connect() to localhost port 10041 (#0) * Trying 127.0.0.1... connected > POST /d/load?table=Site HTTP/1.1 > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: localhost:10041 > Accept: */* > Content-Type: application/json > Content-Length: 50 > * upload completely sent off: 50out of 50 bytes < HTTP/1.1 200 OK < Server: nginx/1.2.1 < Date: Tue, 25 Sep 2012 05:38:24 GMT < Content-Type: application/json < Content-Length: 45 < Connection: keep-alive < * Connection #0 to host localhost left intact * Closing connection #0 [[0,1348551504.38352,0.000763893127441406],1]% postbody.txtの内容がPOSTによりloadできました。 ○ サーバーパッケージ構成と使用ポートの見直し 今回のリリースではサーバーパッケージ構成と使用ポートの見直しを行いました。 従来サーバー用途では以下のHTTPサーバーパッケージのみ提供していました。 groonga-server (HTTPサーバー) groonga-httpd (HTTPサーバー) GQTPプロトコルで使うには不便ですし、デフォルトで使用するポートも GQTPとHTTPで使用ポートがどちらも10041番ポートと衝突していました。 そこで、groonga-serverパッケージを分割し、プロトコルごとで異なるパッケージを 提供するようにしました。 使用するポート番号についても別のポート番号を割りあてるようにしました。 (HTTPは従来通り10041番ポート。GQTPを10043番ポートに割り当て変更。) groonga-server-http (HTTPサーバー 10041ポート) groonga-server-gqtp (GQTPサーバー 10043ポート) 注: groonga-server-httpパッケージとgroonga-httpdパッケージは いずれかのみインストールすることができます。 ○ min/max関数のサポート 今回のリリースではminおよびmax関数をサポートしました。 min関数は与えられた引数のうち最小のものを返し、 max関数は与えられた引数のうち最大のものを返します。 これら関数のサポートにより、検索結果が条件に合致する度合いを示す スコアが極端に高かったり、もしくは低くなってしまった場合に検索結果を 調整することができるようになります。 具体例をmin関数を使ったサンプルで示します。 サンプルで使うスキーマ定義: table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText column_create --table Site --name title --type ShortText column_create --table Site --name point --type Int8 table_create --name Terms --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram column_create --table Terms --name blog_title --flags COLUMN_INDEX|WITH_POSITION --type Site --source title サンプルで使うためのデータ登録: load --table Site [ {"_key":"http://example.org/","title":"This is test record 1!","point":1}, {"_key":"http://example.net/","title":"test record 2.","point":2}, {"_key":"http://example.com/","title":"test test record three.","point":3}, {"_key":"http://example.net/afr","title":"test record four.", "point":4}, {"_key":"http://example.org/aba","title":"test test test record five.","point":5}, {"_key":"http://example.com/rab","title":"test test test test record six.","point":0}, {"_key":"http://example.net/atv","title":"test test test record seven.","point":7}, {"_key":"http://example.org/gat","title":"test test record eight.","point":8}, {"_key":"http://example.com/vdw","title":"test test record nine.","point":9}, ] 例えば、指定した語句(test)をカラムtitleに含むテキストの全文検索を行うことを考え ます。個々のデータには重要度(point)があらかじめ与えられているとします。 単純に指定した語句(test)にマッチするものが多いデータをソート(スコアが同じなら重要度で降順)して 取得するならば以下のクエリで取得できます。 % select --table Site --query title:@test --output_columns _id,_score,title,point --sortby -_score,-point ["_id","UInt32"],["_score","Int32"],["title","ShortText"],["point","Int8"] [6,4,"test test test test record six.",0], [7,3,"test test test record seven.",7], [5,3,"test test test record five.",5], [9,2,"test test record nine.",9], [8,2,"test test record eight.",8], [3,2,"test test record three.",3], [4,1,"test record four.",4], [2,1,"test record 2.",2], [1,1,"This is test record 1!",1] ただし、これだと重要度が低い"test test test test record six."がトップに来ます。 マッチするのは重視したいけれども、それほど高いスコアを与えると望ましい結果にならないときに 調整するのに使えるのが、min関数です。 groongaではスコアを_scoreカラムに保持しています。 そこで、min関数を使って極端に高いスコアにならないようにします。 % select --table Site --query title:@test --output_columns _id,_score,title,point \ --scorer '_score = min(_score, 3) --sortby -_score,-point ["_id","UInt32"],["_score","Int32"],["title","ShortText"],["point","Int8"] [7,3,"test test test record seven.",7], [5,3,"test test test record five.",5], [6,3,"test test test test record six.",0], [9,2,"test test record nine.",9], [8,2,"test test record eight.",8], [3,2,"test test record three.",3], [4,1,"test record four.",4], [2,1,"test record 2.",2],[1,1,"This is test record 1!",1] すると、マッチしているものを重視しつつ、設定済みの重要度も考慮した結果を得ることができるように なります。 ○ 変更点 さて、2.0.6からの変更点は以下の通りです。 http://groonga.org/ja/docs/news.html#release-2-0-7 2.0.7リリース - 2012/09/29 -------------------------- 改良 * [doc] --query_flags の説明を追加。 * [doc][httpd] gzip圧縮についての設定サンプルを追加。 * [httpd][rpm][centos] groonga-httpd initスクリプトを追加。 * [rpm] logrotateの設定ファイルを追加。 * インストール中のデータベース作成をサポート。 * [httpd] groonga_database_auto_create ディレクティブをサポート。 * 集合演算でのスコアのマージをサポート。 [GitHub#31] * [httpd] POSTによる load コマンドをサポート。 * 一時結果テーブルを作成する際のエラーチェックを追加。 [GitHub#33] * GQTP サーバーパッケージを追加。 * max() 関数を追加。 * min() 関数を追加。 修正 * load コマンド実行時にベクタ要素へ主キー値の属する型情報を設定するように修正した。 [GitHub#30] * [httpd] NULLでの初期化漏れを修正した。 [@Kiskeさんが報告] * [httpd] content_type_len のサイズ設定漏れを修正した。 * [rpm][fedora] groonga.service で --bind-address を使うように修正した。 * 不適切なフィルタの引数によリクラッシュする問題を修正した。 [GitHub#32] * Time型からTime型へのキャストで値が壊れる不具合を修正。 * Time型からFloat型へのキャストで値が壊れる不具合を修正。 感謝 * @Kiskeさん -- HAYASHI Kentaro <hayas****@clear*****>