Shinya Kawaji
kawaj****@gmail*****
2012年 5月 10日 (木) 16:36:34 JST
川路です
> result_set = Groonga["Site"].select
> # ↑が--filter "1"相当
> result_set.select("_score = rand() && false", :syntax => :script)
> # ↑が--scorer "_score = rand()"相当
> result_set.sort(["_score"])
> # ↑が--sortby "_score"相当
ありがとうございます。なるほど、そのような書式をすると分かりました。
まだ試せていないですが、やってみます。
> と、こんな感じで書けるとRubyっぽいかなぁというのを思いつきま
> した。
>
> result_set.execute do |record|
> record.score = record.eval do
> # この中のselfは外のselfじゃなくして、
> # groonga内の関数(geo_distance)などがレシーバーなし
> # で使えるようにする。
> # ブロック内でselfをすり替えるのは直感的じゃないので好
> # きじゃないけどevalという名前にすれば、まぁ、いいかなぁと。
> geo_distance(location, "128515259x503187188")
> end
> end
善し悪しはよく分からないのですが、selfをすり替えることだけが問題であれば、
ブロック引数を「関数を受け付けるためだけのレシーバ」にすることになります
でしょうか。
result_set.execute do |record|
record.score = record.eval do |exec|
exec.geo_distance(location, "128515259x503187188")
end
end
しかし、:syntax => :script を使った方法は分かりましたので、書式について
は「良いものを思いついてから」で良いかもしれません。
よろしくお願いします。