BLOGTIMES
::
Home > Solr-rubyでmultiValuedなフィールドにデータを入れる
2009/10/13
[ by hsur at 22:36]

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

  

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が必要です→http://blog.cles.jp/item/3250
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

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

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

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

Web Services by Yahoo! JAPANPowered by NP_SpamBayesJP
★下記に2つの英単語をスペースで区切って入力してください
::
Home > Solr-rubyでmultiValuedなフィールドにデータを入れる