[groonga-dev,00781] ベクターカラムをソート順に使えるか

Back to archive index

Shinya Kawaji kawaj****@gmail*****
2012年 4月 18日 (水) 10:40:37 JST


川路です。

立て続けの質問で恐縮ですが、ベクターカラムをソート順に使いたいので、
そのことで教えていただけますでしょうか。


「最終的にやりたいこと」を説明した方が他の解決方法が分かるかもしれません
ので、前提としてそれを先に書かせていただきます。

全体として数十万件のデータが有り、主キーは数字になっています。

全文検索が主なのですが、ソート順の指定が別にあり、それが「約 50個の
キーのうち、優先とするものをいくつか選ぶ」ということになっています。

そのソート順の指定が、例えば A〜Z まで有るとしたら(本当は 50個なのです
が、単純化して 20数個に)、検索のたびに「H, B, Q の順で優先」とか、
指定がその都度変わります。

各データには、その A〜Z ごとに数字が割り振られています。
例えば「Hが 1、Bが 5、Qが 3」とか、そのような感じです。

求めるクエリの結果としては、

  全文検索でヒットしたデータのうち、
  H が 0のもの、1のもの、...
  B が 0のもの、1のもの、...
  Q が 0のもの、1のもの、... の順に並べる

ということになります。


これを単純に実装する場合、ソート用のカラム A〜Zを全て追加することになる
と思います。

ただこのカラムはソート用のものであり、検索条件や出力には使用しません。
ソート用だけのために 50個ものカラムを追加することに抵抗を感じます。

もっと単純にするには、「数字のベクターカラム」を一つ用意して、
そのベクターカラムの位置(インデックス)で、ソートを指定するようにならな
いか、ということです。

ruby(rroonga)の書き方で書かせていただきますが、例えば

# 0始まりで Hが 7、B が 1、Qが 16
Groonga["Items"].sort(["sort_column[7],sort_column[1],sort_column[16]")

というように、「ベクターカラムの n番目」の指定が出来れば、ソート用の
カラムは一つで済みます。


気になっているのは、

 * 「ベクター」という名称なのだから、配列のように使おうとすること自体が
   間違いなのではないか。

 * 「ソート条件にベクターカラムが指定されたらエラーを返す」というリクエ
   ストがそもそも有るので、ベクターをソートに使うこと自体が間違いかも
   しれない
   http://redmine.groonga.org/issues/569

 * 「複数のソート順を指定する」と書いたが、もし「一つのソート順を指定
   する」で、簡単に解決するなら、それにするかもしれない。

   これは、上記の例で「H, B, Q の順で優先」と書いたものを、「Hの順で優先」
   と、一つしか選べなくする、というものです。そのほうが良い解決があれば、
   それも可能です。

 * ベクターカラムを使わなくても、他の違う方法が有るかもしれない

ということです。


長くなりましたが、どうぞよろしくお願いします。




groonga-dev メーリングリストの案内
Back to archive index