1

我的应用程序拥有Machines并属于许多Specifications

class Machine < ActiveRecord::Base
  has_and_belongs_to_many :specs

规格具有field(宽度、重量、容量、马力)和value属性。

搜索完全通过 Solr 通过 Sunspot 完成。

我希望能够根据其规格找到一台机器,例如找到宽度大于 50 的所有机器。

我知道我可以单独索引spec_fieldspec_value,但它会过滤值超过 50 的规格,其中可能包括我不想要的字段,例如高度或容量(因此搜索宽度 > 50 将在结果中产生容量 > 50) .

理想情况下,我想将机器的每个规格及其值分配给它自己的索引字段,以便我的索引具有诸如“高度”或“重量”之类的字段,但规格是灵活的,有些机器有一个一套规格,而另一台机器有一套不同的规格,所以看起来它不能正常工作。

甚至可以用 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 回答