Kouhei Sutou
kou****@clear*****
2016年 5月 6日 (金) 11:52:00 JST
須藤です。 In <CANM+HhcjeYcFPO+w0Ujv_m10j9****@mail*****> "[groonga-dev,04023] ドリルダウン結果の任意のkeyの順位を取得したい" on Fri, 29 Apr 2016 18:12:32 +0900, Naoya Murakami <visio****@gmail*****> wrote: > Groongaでドリルダウン結果の任意のkeyの順位を取得できるようにしたいと > 考えています。 > > たとえば、 > > _key, _nrecs > 東京, 5000 > 神奈川, 3000 > 兵庫, 300 > > というドリルダウン結果がある場合、兵庫が3番目であることを知りたいです。 > > 数が少ない場合は全部だせばいいのですが、1万件とかになると全部 > 吐き出すのはやりたくないです。 > > そこで、以下のような実装案を考えてみました。 > > 1. グループ結果に順位を割り当てる > --drilldown[label].calc_type RANK > > 2. ドリルダウン結果をfilterする > --drilldown[label].filter '_key == "タグA"' > > RANKをわざわざ割り当てるのは、filter後でもグループ結果時点の順位を > 得るためです。 > (filterしない場合は_idでランクはわかりますが、filterすると変わるので。) なるほど。いわゆるウィンドウ関数が欲しいということですね。 ウィンドウ関数をcalc_typeで実現するのはキビシイです。というのは、 calc_typeを計算するときは前後のレコードの情報を知らないからです。RANK を実現するためには、該当レコードが何番目か?という情報が必要ですが、前 後のレコードの情報を知らないとソートできないので計算できないのです。ま た、_nsubrecsでソートするためにはドリルダウンがすべて終わっている必要 がありますが、calc_typeはドリルダウンしながら計算するのでこの時点では 必要な情報が足りません。 ということで、別のアプローチが必要になります。 masterに https://github.com/groonga/groonga/issues/461 で説明している 動的カラム作成機能を入れました。これと同じような感じで、 --drilldown[label].column[rank].stage initial \ --drilldown[label].column[rank].type UInt32 \ --drilldown[label].column[rank].flags COLUMN_SCALAR \ --drilldown[label].column[rank].value 'rank()' \ --drilldown[label].column[rank].sortby _nsubrecs とできるようにするのはどうかなぁと思いました。 で、ここで定義したrankはoutput_columnsで使えます。 --drilldown[label].output_columns '_key, _nsubrecs, rank' ーーdrilldown[label].filterはよいと思います。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ リーダブルコードワークショップ: http://www.clear-code.com/services/code-reader/readable-code-workshop.html