2011-01-20 1 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에서 더 검색을하지 않는 경우 모두를 표시합니다.결과

내가 텍스트 태그에 모든 문자열 태그를 만들 생각하지만이 오류를 반환 믿을 :이 키워드에 응답 얻을 실종 무엇

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 필드를 처리하는 방법을 생각하고 있습니다.

또한 기본적으로 Sunspot의 검색 방법은 모든 텍스트 필드를 검색하므로 검색 할 텍스트 필드가없는 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