1

私のアプリはMachinesそれを持っていて、多くのものに属していますSpecifications

class Machine < ActiveRecord::Base
  has_and_belongs_to_many :specs

仕様には、field(幅、重量、容量、馬力)とvalue属性の両方があります。

検索は、Sunspotを介してSolrを介して完全に実行されます。

幅が50を超えるすべてのマシンを検索するなど、仕様に基づいてマシンを検索できるようにしたいと思います。

インデックスを作成spec_fieldしてspec_value個別に作成できることはわかっていますが、値が50を超える仕様をフィルタリングします。これには、高さや容量など、不要なフィールドが含まれる可能性があります(したがって、幅> 50を検索すると、結果で容量> 50になります) 。

理想的には、マシンの各仕様をその値とともに独自のインデックス付きフィールドに割り当てて、インデックスに「高さ」や「重量」などのフィールドが含まれるようにしたいのですが、仕様は柔軟であり、一部のマシンには1つあります。スペックのセットですが、別のマシンには別のセットがあるため、うまくいくようには見えません。

Solrでも実行できますか?

4

2 に答える 2

4

解決策が見つかりました

私が見つけた解決策は、ここで説明されているように「動的フィールド」を使用することでした

索引付け

dynamic_integer :specs do
  specs.inject({}) do |hash,spec|
    hash.merge(spec.spec_field.label.to_sym => spec.value)
  end
end

クエリ

  dynamic :specs do
    if params[:specs].present?
      for spec in params[:specs]
        case spec[:condition]
          when "gt"
            with(spec[:field]).greater_than(spec[:value])
          when "lt"
            with(spec[:field]).less_than(spec[:value])
          else
            with(spec[:field],spec[:value])
        end
      end
    end
  end

SOLR はますます良くなり続けています。

于 2012-07-06T14:00:44.770 に答える
0

指定した数値範囲と文字列値に対して TRUE を返すメソッドを構築し、そのブール値にインデックスを付けることができます。

def width_greater_than_50
  (field == "width") && (value > 50)
end

:width_greater_than_50次に、インデックスを作成するものとしてシンボルを渡します。

于 2012-07-05T19:53:23.240 に答える