我的应用Machines
已拥有并属于许多Specifications
class Machine < ActiveRecord::Base
has_and_belongs_to_many :specs
规格同时具有field
(宽度,重量,容量,马力)和value
属性。
搜索完全通过Solr通过太阳黑子完成。
我希望能够根据其规格找到一台机器,例如查找宽度大于50的所有机器。
我知道我可以单独索引spec_field
和spec_value
,但它会过滤值大于50的规格,其中可能包含我不想要的字段,例如高度或容量(所以搜索宽度> 50将导致结果容量> 50。
理想情况下,我想将机器的每个规格分配给它自己的索引字段及其值,以便我的索引具有“高度”或“重量”等字段,但规格是灵活的,有些机器有一组规格,而另一台机器有不同的设置,所以它看起来不像它可以解决。
甚至可以用Solr完成吗?
答案 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
作为要索引的内容传递。