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