3

我以为我有这个小菜一碟..但是每当我对任何关键字进行查询时,它都不会从 SQL 加载任何表。我没有错误。

用户.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 回答