[groonga-dev,04024] Re: ドリルダウン結果の任意のkeyの順位を取得したい

Zurück zum Archiv-Index

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




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index