3

私はこれを簡単に持っていると思っていました..しかし、キーワードでクエリを実行するたびに、SQLからテーブルをロードしません。エラーは発生しません。

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

まったく検索しないと、すべてのUser結果が正常に表示されます

これらすべての文字列タグをテキストタグにすると思いますが、次のエラーが返されます。

Sunspot::UnrecognizedFieldError in Admin/usersController#index

No field configured for User with name 'first_name'

これをキーワードに応答させるには何が欠けていますか?

4

2 に答える 2

12

(あなた自身のフォローアップのためのより完全な説明。)

セットアップについて:

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検索方法は、デフォルトですべてのテキスト フィールドに対して検索を行います。これが、テキスト フィールドを含めても結果が得られない理由を説明しています。つまりkeywords、ドキュメントには検索対象のテキスト フィールドがありません。

自己フォローアップで指摘したように、textフィールドに切り替えて、期待する結果を得る必要があります。

于 2011-01-20T15:45:53.923 に答える
2

これは必ずしも良い答えではありませんが、文字列とテキストタグを組み合わせるとうまくいくことがわかります。したがって、私のユーザーモデルは次のようになります。

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
于 2011-01-20T14:40:50.937 に答える