[groonga-dev,02041] Re: [rroonga] Groonga::Table#paginate の結果から参照元のレコードのidを取得したい

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 1月 9日 (木) 11:29:48 JST


須藤です。

In <CA+vpKiqQL=XNwzZX6b_CjtaU****@mail*****>
  "[groonga-dev,02039] [rroonga] Groonga::Table#paginate の結果から参照元のレコードのidを取得したい" on Thu, 9 Jan 2014 01:49:31 +0900,
  ongaeshi <ongae****@gmail*****> wrote:

> ある Groonga::Array を生成した際、Groonga::Table#select の結果から実レコードのidを取得したい時は
> 
> results = array.select("aaa")   # 検索
> record = results.first          # 検索結果からレコードを取得
> id = record.key.id              # 実レコードのidを取得
> 
> で取得出来ますが、 Groonga::Table#paginate の結果からは取得出来ないようです。
> 
> results = array.select("aaa")   # 検索
> results.paginate(               # さらにページネーション処理
>   [["_score", :desc]],
>   :page => 1)
> record = results.first          # ページネーション結果からレコードを取得
> id = record.key.key.id          # エラー、record.key の結果が nil になる
> 
> paginateの結果から実レコードのidを取得することは可能でしょうか?

可能です!

record.value.key.idでいけます!
       ^^^^^
       keyじゃなくvalue

検索結果は順番が関係ないので一時Groonga::Hashで返すのですが、
paginateは順番が関係あるので一時Groonga::Arrayで結果を返すの
です。Groonga::Hashにはキーがあるので、そこに実レコードのIDが
入っているのですが、Groonga::Arrayにはキーがないので、valueの
ところに実レコードのIDが入っています。

検索結果に対してのrecord.keyは

  検索結果の一時Groonga::Hashのキーに入っている実レコードの
  IDを取得してGroonga::Recordオブジェクトを返す

ということをしています。

一方、paginateの結果に対してのrecord.valueは

  paginate結果の一時Groonga::Arrayのvalueに入っている実レコー
  ドのIDを取得してGroonga::Recordオブジェクトを返す

というようになります。


ちなみに、sortも同じようにGroonga::Arrayを返すのでrecord.key
ではなくrecord.valueになります。

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

Groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




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