我正在使用太阳黑子宝石向我的rails应用添加搜索,我希望能够按ID,数量或描述搜索交易。通过单个属性搜索工作正常,但是当我在搜索块中添加多个with
或fulltext
调用时,我没有返回任何结果。我发现我可以在with
块中包含any_of
次调用,但包含fulltext
会导致undefined method 'fulltext' for #<Sunspot::DSL::Scope:0x007fb6519c13a0>
错误。
当我仅搜索1个属性时,搜索返回正确的结果,这意味着我在any_of块中只有1个或1个全文。所以我要按惯例,数量和描述进行搜索。意味着如果存在具有id 213的事务,则搜索213返回具有id 213的事务。如果我搜索$ 4.25,则结果返回每个事务的金额$ 4.25。如果我搜索星巴克&#39;,那么我就可以通过星巴克&#39;进行每笔交易。在描述中。如果我在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
答案 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
如果要搜索非文本值,则需要先将其更改为文本值;在某些情况下,我可以看到这对于搜索很有价值,例如,如果你有一个唯一的数字用户ID。
答案 1 :(得分:0)
所以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
所以现在我可以按描述,身份或数量进行搜索。