我错过了Solr-Sunspot设置的哪一部分?

时间:2011-01-20 14:27:31

标签: ruby-on-rails search solr sunspot

我以为我有这个蛋糕..但是无论何时我对任何关键字进行查询都不会从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'

为了回复关键字,我缺少什么?

2 个答案:

答案 0 :(得分: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字段才能获得您期望的结果。

答案 1 :(得分: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