太阳黑子和高级协会搜索

时间:2012-07-05 19:42:13

标签: ruby-on-rails ruby search solr sunspot

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

class Machine < ActiveRecord::Base
  has_and_belongs_to_many :specs

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

搜索完全通过Solr通过太阳黑子完成。

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

我知道我可以单独索引spec_fieldspec_value,但它会过滤值大于50的规格,其中可能包含我不想要的字段,例如高度或容量(所以搜索宽度> 50将导致结果容量> 50。

理想情况下,我想将机器的每个规格分配给它自己的索引字段及其值,以便我的索引具有“高度”或“重量”等字段,但规格是灵活的,有些机器有一组规格,而另一台机器有不同的设置,所以它看起来不像它可以解决。

甚至可以用Solr完成吗?

2 个答案:

答案 0 :(得分:4)

找到解决方案

我找到的解决方案是使用here

所述的“动态字段”

分度

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

QUERY

  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让我看起来越来越好!

答案 1 :(得分:0)

您可以构造一个方法,为您指定的数字范围和字符串值返回TRUE,然后索引该布尔值。

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

然后,您可以将符号:width_greater_than_50作为要索引的内容传递。