2011-01-20 39 views
1

我以爲我有這個蛋糕......但任何時候我對任何關鍵字進行查詢,它不會從SQL加載任何表。我沒有得到任何錯誤。這個Solr-Sunspot設置的哪部分我缺少?

user.rb

searchable do 
    string :first_name 
    string :last_name 
    string :name 
    string :email 
    time :created_at 
end 

users_controller.rb

class Admin::UsersController < Admin::ApplicationController 

    def index 
    s = Sunspot.search User do |query| 
     query.keywords params[:q] 
     query.any_of do |any_of| 
     any_of.with(:first_name) 
     any_of.with(:first_name) 
     any_of.with(:email) 
     any_of.with(:name) 
     end 
     query.paginate :page => (params[:page] && params[:page].to_i || 1), :per_page => 20 
     query.order_by('created_at', 'desc') 
    end 

    s.execute! 
    @users = s.results 

    render :action => 'index' 
    end 

然後我跑:

$> script/console 
$> User.reindex 

當我做在all..it成功沒有搜索顯示全部User結果

相信我做所有這些字符串變量轉換爲文本標籤,但返回此錯誤:

Sunspot::UnrecognizedFieldError in Admin/usersController#index 

No field configured for User with name 'first_name' 

缺少什麼我得到這個關鍵字應對?

回答

11

(爲自己的自後續更完整的解釋。)

關於你的設置:

searchable do 
    string :first_name 
    string :last_name 
    string :name 
    string :email 
    time :created_at 
end 

Solr中的字符串是打算用於精確匹配。它不是按文本列的方式進行預處理或標記。這些文字匹配用於過濾(「category_name等於'Sale'」),分面,排序等。

你更可能想要text字段。文本字段使用Standard Tokenizer進行標記,使用LowerCase Filter進行縮小,並使用Standard Filter和其他可能的選項刪除它們的點和撇號。

當人們想到Solr的全文搜索功能時,他們正在考慮如何處理text字段。

此外,太陽黑子的默認搜索方法keywords會針對所有文本字段進行搜索,這就解釋了爲什麼在包含keywords時沒有得到結果 - 您的文檔沒有文本字段進行搜索。

正如您在自我跟進中所注意到的,您需要切換到text字段以獲得您期望的結果。

1

這不是最好的答案,但我發現將字符串和文本標籤組合在一起就可以工作。所以,我的用戶模型是這樣的:

searchable do 
    text :first_name 
    text :last_name 
    text :name 
    text :email 
    time :created_at 
    string :first_name 
    string :last_name 
    string :name 
    string :email 
end