2016-04-29 21 views
2

我正在將搜索添加到帶有太陽黑子寶石的rails應用程序中,我希望能夠通過id,金額或描述搜索交易。通過單個屬性搜索工作正常,但是當我在搜索塊中添加多個withfulltext調用時,我不會返回任何結果。我發現我可以在any_of塊中包裝with調用,但包括fulltext會導致undefined method 'fulltext' for #<Sunspot::DSL::Scope:0x007fb6519c13a0>錯誤。使用太陽黑子搜索同一型號上的多個不同類型的字段

當我僅搜索1個屬性時,搜索返回正確的結果,這意味着我在any_of塊中只有1個或全部文本。所以我要單獨搜索id,金額和描述。意思是如果有一個帶有ID 213的交易,搜索213將返回帶有ID 213的交易。如果我搜索$ 4.25,那麼結果將返回每個交易4.25美元。如果我搜索「星巴克」,那麼我會在描述中與「星巴克」進行每筆交易。如果我在anyblock中有多個with或全文,我不會得到任何返回的結果。

我缺少什麼?

我有一個交易模式,像這樣:

class Transaction < ActiveRecord::Base 
    ... 

    searchable do 
    text :description 
    integer :id 
    float :amount 
    end 

    ... 
end 

和Controller像這樣的動作:

def search 
    @search = Transaction.search do 
    any_of do 
     with(:amount, params[:search]) 
     with(:id, params[:search]) 
     fulltext(params[:search]) 
    end 
    end 

    @transactions = @search.results 
end 
+0

它是如何「打破它」?它是否給出錯誤,不返回結果,做不正確的結果返回等等。你可以發佈什麼params [:搜索]是,並且你可以驗證你實際上是否有一個包含該搜索的'description'字段的模型 – PhilVarg

+0

我更新了錯誤和更多細節的問題。我需要知道如何在同一模型中搜索不同類型的多個字段,因此錯誤可能是語法。我確實有一個帶有描述字段的交易模型。 –

回答

1

太陽黑子不打算尋找非文本字段。其他字段類型日期/整數/等..可用於在全文搜索之前對搜索進行範圍。

由於你提出了這個問題,太陽黑子是不可能的。

在這個例子中,您可以看到浮動字段amount如何用於全文搜索前的範圍。

def search 
    @search = Transaction.search do 
    with(:amount).greater_than(params[:amount]) 
    fulltext params[:search] do 
     fields :description 
    end 
    end.results 
end 

如果您想要搜索非文本值,您需要先將它們更改爲文本值;在某些情況下,我可以看到這對於搜索很有價值,例如您是否擁有唯一的數字用戶標識。

+0

當我在全文塊中添加一個不是字符串類型的字段時,我得到一個「沒有爲名稱爲'amount'的事務配置文本字段」的錯誤。 –

+0

對不起,我誤解你在問什麼。我已經更新了我的答案。 – bigtunacan

+0

對不起,我沒有解釋清楚。假設星巴克有5美元的交易。如果用戶搜索「星巴克」和/或「5.00」,我希望該交易位於搜索結果中。假設太陽黑子足夠聰明,可以看到params [:search]可以是文本和/或數字,並將使用數字來搜索數量或ID。 –

0

所以bigtunacan是正確的。在非文本字段上搜索是不可能的。該文檔說:

文本字段將全文搜索。其他字段(例如,整數 和字符串)可用於範圍查詢。

但是,爲了使這項工作,你可以傳遞一個塊到文本方法和太陽黑子將索引塊的結果。所以我通過字符串傳入所有我想要搜索的字段。

所以在我的交易模式,我有:

# we have to create an alias because sunspot uses 'id' for something 
alias_attribute :transaction_id, :id 

searchable do 
    text :transaction do 
    "#{description} #{amount} #{transaction_id}" 
    end 
end 

而在我的交易控制器我有:

def search 
    search = Transaction.search do 
    fulltext(params[:search]) 
    end 

    @transactions = search.results 
end 

所以,現在我可以說明,ID,或金額進行搜索。