2012-01-30 67 views
0

我使用的是太陽黑子(https://github.com/sunspot/sunspot)使用Rails。太陽黑子搜索排序

這裏是我的模型:

class Item < ActiveRecord::Base 
    searchable do 
    boolean :red 
    boolean :blue 
    boolean :green 
    ... 
    end 
end 

考慮以下搜索:

Item.search 
    any_of do 
    with :red, true 
    with :blue, true 
    with :green, true 
    end 
end 

如何訂購的結果是這樣的:包含所有的顏色,繼而是含顏色的2項的項其次是包含1種顏色的物品?

注意:這只是一個例子搜索。答案應該考慮所有可能的顏色搜索組合。

更新1

排序方式的顏色數量將無法正常工作。例如,假設您有物品:

  1. 綠/藍
  2. 綠/紅/黑

如果您搜索綠色和藍色,第2項會項目之前1.

回答

0

醜陋的,但可能會做的伎倆:

class Item < ActiveRecord::Base 
    searchable do 
    boolean :red 
    boolean :blue 
    boolean :green 
    integer :number_of_colors, :stored => true 
    end 

    def number_of_colors 
    # implementation may vary 
    count=0 
    self.attributes.each do |k,v| 
     if %w(red blue green).include?(k.to_s) && v? 
     count += 1 
     end 
    end 
    count 
    end 
end 

然後,重新建立索引後:

Item.search 
    any_of do 
    with :red, true 
    with :blue, true 
    with :green, true 
    order_by :number_of_colors, :desc 
    end 
end 

希望這有助於。

+0

好主意,但我不認爲它會工作。看到我上面的更新。 – Austin 2012-01-31 00:50:19

0

哦!我沒有想到在那裏有其他顏色的地方...感謝您的更新。在這種情況下,另一個選項是將可搜索的塊中的一個text字段中的所有對象的顏色代碼(名稱)合併,然後在該字段上運行全文搜索,並將所有需要的顏色作爲關鍵字。獲得更多匹配的對象將獲得最高相關性分數,並且將首先返回。喜歡的東西:

class Item < ActiveRecord::Base 
    searchable do 
    text :color_codes, :stored => true 
    end 

    # will return "green blue " for item1 above 
    # will return "green red black " for item2 above 
    def color_codes 
    # implementation may vary 
    colors="" 
    self.attributes.each do |k,v| 
     if %w(red blue green black ...).include?(k.to_s) && v? 
     colors += "#{k} " 
     end 
    end 
    colors 
    end 
end 

然後,你的搜索程序看起來像:

q = "green blue" 
Item.search do 
    keywords q do 
    fields :color_codes 
    end 
end 

物品1的「綠藍」搜索時上面會得到精確匹配,並會拿出第一。