BLOGTIMES
2009/10/13

Solr-rubyでmultiValuedなフィールドにデータを入れる

  ruby  solr 
このエントリーをはてなブックマークに追加

SolrのRubyクライアントであるSolr-rubyはちゃんとドキュメンテーションがされていないので、サンプルに載っていない事をやろうとすると結局ソースを読まなくてはいけないのが難点です。今回はスキーマでmultiValued="true"と指定されているフィールドに複数の値しようと思ったのですが、やり方が分からないので適当にArrayに入れて突っ込んでみたところ、これが偶然通ってしまいました。

#!/bin/ruby require 'solr' data = { :id => 1, :name => "foo", :category => ["bar","baz"], } doc = Solr::Document.new(data) conn = Solr::Connection.new('http://localhost:8983/solr', :autocommit => :on) conn.add(doc) conn.close

ひとまずやりたい事は達成できたものの、ちょっとこのままでは気持ち悪いので調べてみます。

Solr::Documentクラスにちょうど下記のような部分があり、Hashのvalueになっているオブジェクトがeachメソッドを持っていて、String以外のクラスであるという条件を満たしていれば、eachを使って要素を取り出して追加するようになっていました。

/usr/lib64/ruby/gems/1.8/gems/solr-ruby-0.0.7/lib/solr/document.rb

# Append a Solr::Field # # doc << Solr::Field.new(:creator => 'Jorge Luis Borges') # # If you are truly lazy you can simply pass in a hash: # # doc << {:creator => 'Jorge Luis Borges'} def <<(fields) case fields when Hash fields.each_pair do |name,value| if value.respond_to?(:each) && !value.is_a?(String) value.each {|v| @fields << Solr::Field.new(name => v)} else @fields << Solr::Field.new(name => value) end end when Solr::Field @fields << fields else raise "must pass in Solr::Field or Hash" end end

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3250
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン