2

我有一個附件表具有多個值(通過多態聯繫)。我希望能夠通過思考獅身人面像來搜索多個值(如SQL中的AND)。使用思維斯芬克斯搜索多個多態項目

例如:

class FieldValue < ActiveRecord::Base 
    belongs_to :customized, :polymorphic => true 
end 

class Attachment < ActiveRecord::Base 
    has_many :field_values, :as => :customized, :dependent => :destroy 

    define_index do 
    has field_values.field_id, :as => :field_ids, :type => :multi 

    indexes field_values.value, :as => :field_values, :type => :multi 

    set_property :enable_star => 1 
    set_property :min_infix_len => 3 
    end 
end 

我fieldValue方法模型有一個字段(值),所以使用上述指數的定義,我可以這樣做:

Attachment.search :conditions => { :field_values => ["*5100*", "1"] }, :with => { :field_ids => [23, 24] } 

但是,這在技術上不做我所希望的。該field_values應該匹配field_ids(類似於select * from attachments where (field_value.id = 23 and field_value.value like '*5100*) and (field_value.id = 23 and field_value.value = '1')

(我知道有聯接缺少以上:P)

是否有可能做一個類似的搜索

回答

1

獅身人面像沒有的概念鍵/值對,所以你不能要求它匹配給定field_values上的值和field_id。

如果你想搜索匹配單個值/ id對的附件,可能的解決方法是搜索FieldValue代替,並且由customized_id組成:

class FieldValue < ActiveRecord::Base 
    define_index do 
    indexes value 
    has field_id, customized_id 
    end 
end 

FieldValue.search :conditions => {:value => '1'}, :with => {:field_id => 23}, 
    :group_by => 'customized_id', :group_function => :attr 

該分組將確保您只能爲每個附件獲得一個匹配。

但是,這恐怕無法幫助匹配附件的多個值/ id對。我想不出有什麼辦法可以讓獅身人面像離開我的頭頂。

+0

我曾經使用FieldValue上的索引來進行搜索,但看起來我最終得到的結果只是一些'黑客',所以希望有一種'官方'的方式來做到這一點。基本上,我試圖複製類似: ''' define_index做 指標:value_one 指標:value_two 指標:value_three 結束 ''' 但由於該協會是多態的,VALUE_ [one..three]被定義爲鍵/值(如上所述)。我可以使用標準的Attachment.search解決這個問題,然後單獨的FieldValue.search調用併合並結果,但這是我想避免的破解:P – 2012-03-02 13:54:02

+0

對不起,試圖編輯一堆時間,但忘記了你不能真的格式意見:P – 2012-03-02 13:56:41

+0

是否可以單獨獲得結果並將它們相交?看到這個問題:http://stackoverflow.com/questions/30305981/intersect-thinking-sphinx-results – Jonathan 2015-05-18 14:48:17

0

這可以分幾步完成。

  1. 你需要引用fieldValue方法的IDS附件索引:

    has field_values.id, :as => :field_values_ids

  2. 獲取的ID您需要的fieldValue方法對:

    v1 = FieldValue.search_for_ids(conditions: { value: "*5100*" }, with: { field_id: 23 })

    v2 = FieldValue.search_for_ids(conditions: { value: "1" }, with: { field_id: 24 })

  3. 搜索附件具有這些對:

    r1 = Attachment.search(with: { field_values_ids: v1 })

    r2 = Attachment.search(with: { field_values_ids: v2 })

  4. 相交的結果:

    r1.to_a & r2.to_a

買者:您洛杉磯e分頁和排序(見我的問題Pat's answer)。