簡體   English   中英

使用sunspot在同一模型上搜索多個不同類型的字段

[英]Using sunspot to search multiple fields of different types on same model

我正在使用 sunspot gem 向我的 rails 應用程序添加搜索,我希望能夠按 ID、金額或描述搜索交易。 按單個屬性搜索工作正常,但是當我在搜索塊中添加多個withfulltext調用時,我沒有返回任何結果。 我發現我可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM