使用太阳黑子在同一模型上搜索不同类型的多个字段

时间:2016-04-29 19:47:16

标签: ruby-on-rails sunspot sunspot-rails

我正在使用太阳黑子宝石向我的rails应用添加搜索,我希望能够按ID,数量或描述搜索交易。通过单个属性搜索工作正常,但是当我在搜索块中添加多个withfulltext调用时,我没有返回任何结果。我发现我可以在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

2 个答案:

答案 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

所以现在我可以按描述,身份或数量进行搜索。