Ruby on rails 太阳黑子与高级关联搜索

Ruby on rails 太阳黑子与高级关联搜索,ruby-on-rails,ruby,search,solr,sunspot,Ruby On Rails,Ruby,Search,Solr,Sunspot,我的应用程序有机器,这些机器拥有并属于许多规格 class Machine < ActiveRecord::Base has_and_belongs_to_many :specs 类机器50将在结果中产生容量>50) 理想情况下,我希望将一台机器的每个规格与其值一起分配给它自己的索引字段,以便我的索引有“高度”或“重量”等字段,但规格是灵活的,有些机器有一组规格,而另一台机器有一组不同的规格,因此看起来它无法工作 用Solr能做到吗 您可以构造一个方法,为指定的数字范围和字符串值返回

我的应用程序有
机器
,这些机器拥有并属于许多
规格

class Machine < ActiveRecord::Base
  has_and_belongs_to_many :specs
类机器
规格同时具有
字段
(宽度、重量、容量、马力)和
属性

搜索完全是通过太阳黑子进行的

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

我知道我可以分别为
spec_字段
spec_值
编制索引,但它会过滤值大于50的spec,其中可能包括我不想要的字段,例如高度或容量(因此搜索宽度>50将在结果中产生容量>50)

理想情况下,我希望将一台机器的每个规格与其值一起分配给它自己的索引字段,以便我的索引有“高度”或“重量”等字段,但规格是灵活的,有些机器有一组规格,而另一台机器有一组不同的规格,因此看起来它无法工作


用Solr能做到吗

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

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

然后将符号
:width\u大于\u 50作为要索引的对象传递。

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

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

然后将符号
:width\u大于\u 50
作为要索引的对象传递。

找到解决方案

我找到的解决方案是使用所描述的“动态字段”

索引

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


索尔在我看来越来越好

找到解决方案

我找到的解决方案是使用所描述的“动态字段”

索引

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


索尔在我看来越来越好

它将如何工作?我知道这将索引机器的宽度是否超过50,但现在我需要搜索超过200的“容量”。我不能索引所有可能的搜索查询。哦,我误解了;我认为这是一个索引问题。听起来你有更多的疑问。这是正确的吗?我把它看作是索引和查询问题,主要是因为我不知道如何做。。。如果您查看solr.CurrencyField,就会看到它是如何以“amount,currency”格式存储的,然后它就能够以某种方式搜索它。我觉得这是一个我应该关注的方向,但仍然没有线索。它将如何工作?我知道这将索引机器的宽度是否超过50,但现在我需要搜索超过200的“容量”。我不能索引所有可能的搜索查询。哦,我误解了;我认为这是一个索引问题。听起来你有更多的疑问。这是正确的吗?我把它看作是索引和查询问题,主要是因为我不知道如何做。。。如果您查看solr.CurrencyField,就会看到它是如何以“amount,currency”格式存储的,然后它就能够以某种方式搜索它。我觉得这是我应该关注的一个方向,但仍然没有线索。如果我能给你发很多荣誉点数,我会的。这是完美的:)+1如果我能给你很多声誉点,我会的。这是完美的:)