2012-07-05 30 views
1

我的應用程序有Machines已經和屬於許多Specifications太陽黑子和高級搜索協會

class Machine < ActiveRecord::Base 
    has_and_belongs_to_many :specs 

規格兼得field(寬度,重量,容量,馬力)和value屬性。

搜索完全通過Solr通過太陽黑子完成。

我希望能夠找到一臺機器基於其規格,如發現所有的機器與寬度大於50

我知道我可以索引spec_fieldspec_value分開,但它會篩選價值超過50的規格,其中可能包括我不想要的領域,例如高度或容量(因此,如果搜索寬度> 50,那麼結果中的容量大於50)。

理想情況下,我想將機器的每個規格指定爲其自己的索引字段以及其值,以便我的索引具有「高度」或「重量」等字段,但規格是靈活的,並且有些機器有一組規格,而另一臺機器有不同的規格,所以看起來不像是可以實現的。

它甚至可以用Solr完成嗎?

回答

4

發現的解決方案

我找到的解決方案是使用 「動態字段」 中所述here

INDEXING

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繼續尋找更好一個對我更好!

+0

+1如果我可以給你發送很多聲望點,我會的。太棒了 :) – sevenseacat 2013-09-12 03:48:00

0

您可以構造一個方法,該方法對於指定的數字範圍和字符串值返回TRUE,然後索引該布爾值。

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

然後,您會將符號:width_greater_than_50作爲要索引的東西。

+0

它將如何工作?我知道這將索引是否機器的寬度超過50,但現在我需要搜索超過200的「容量」。我無法索引所有可能的搜索查詢。 – 2012-07-05 19:57:24

+0

哦,我誤解了;我認爲這是一個索引問題。這聽起來像你有更多的查詢問題。那是對的嗎? – Ron 2012-07-05 20:04:10

+0

我把它看作索引和查詢問題,主要是因爲我不知道如何去做......如果你看看solr.CurrencyField,你會看到它是如何以「金額,貨幣」格式存儲的,然後不知何故它能夠搜索它。我覺得這是我應該看的一個方向,但仍然沒有線索。 – 2012-07-05 20:07:16