[英]Using sunspot to search multiple fields of different types on same model
我正在使用 sunspot gem 向我的 rails 應用程序添加搜索,我希望能夠按 ID、金額或描述搜索交易。 按單個屬性搜索工作正常,但是當我在搜索塊中添加多個with
或fulltext
調用時,我沒有返回任何結果。 我發現我可以將with
調用包裝在any_of
塊中,但包含fulltext
會導致undefined method 'fulltext' for #<Sunspot::DSL::Scope:0x007fb6519c13a0>
錯誤的undefined method 'fulltext' for #<Sunspot::DSL::Scope:0x007fb6519c13a0>
。
當我只搜索 1 個屬性時,搜索會返回正確的結果,這意味着我在 any_of 塊中只有 1 個 with 或 1 個全文。 所以我要按id,數量和描述單獨搜索。 意思是如果有一個 id 為 213 的交易,搜索 213 會返回 ID 為 213 的交易。如果我搜索 $4.25,那么結果將返回金額為 $4.25 的每筆交易。 如果我搜索“Starbucks”,那么我會在描述中得到每筆帶有“Starbucks”的交易。 如果我在 anyblock 中有多個 with 或 fulltext ,則不會返回任何結果。
我錯過了什么?
我有一個像這樣的交易模型:
class Transaction < ActiveRecord::Base
...
searchable do
text :description
integer :id
float :amount
end
...
end
控制器中的動作如下:
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
Sunspot 不用於搜索非文本字段。 其他字段類型日期/整數/等.. 可用於在全文搜索之前確定搜索范圍。
正如您提出的問題,太陽黑子是不可能的。
在此示例中,您可以看到如何在全文搜索之前使用浮點字段amount
來確定范圍。
def search
@search = Transaction.search do
with(:amount).greater_than(params[:amount])
fulltext params[:search] do
fields :description
end
end.results
end
如果要搜索非文本值,則需要先將它們更改為文本值; 我可以看到在某些情況下這對搜索很有價值,例如如果您有一個唯一的數字用戶 ID。
所以 bigtunacan 是對的。 無法搜索非文本字段。 文檔說:
文本字段將可進行全文搜索。 其他字段(例如,整數和字符串)可用於確定查詢范圍。
但是要完成這項工作,您可以將一個塊傳遞給 text 方法,而 sunspot 將索引該塊的結果。 所以我在字符串中傳遞了我想搜索的所有字段。
所以在我的交易模型中,我有:
# 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 或數量進行搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.