sunspot_solr分组子句中的未定义字段错误

时间:2012-07-05 04:08:27

标签: mysql sunspot sunspot-rails sunspot-solr rsolr

我有product_details表属于类别。 product_details包含id,name,price,discount和category_id等字段,而categories表包含id和name等字段。我正在使用mysql数据库我试图根据category_id进行产品组详细信息。为了进行分组,我提到了https://gist.github.com/f987013b2feec5b28456。但我得到错误以下错误

RSolr::Error::Http - 400 Bad Request
Error:     undefined field category_id

我的模型看起来像这样

    class ProductDetail < ActiveRecord::Base
      belongs_to :category

      searchable do
        text :name
        integer :category_id
      end

    end

我的控制器看起来像这样

def index
      @search_res1=ProductDetail.search do

        adjust_solr_params do |params|
          params[:group] = true
          params[:"group.field"] = "category_id"
          params[:"group.format"] = "simple"
        end

      end.execute
      @navurls=@search_res1.results
end

在我的日志文件中,我得到了这样的

  RSolr ::错误:: HTTP     在ProductDetailsController #index中

RSolr::Error::Http - 400 Bad Request
Error:     undefined field category_id

Request Data: "fq=type%3AProductDetail&fq=category_id_i%3A%281%29&start=0&rows=30&group=true&group.field=category_id&group.format=simple&q=%2A%3A%2A"

Backtrace: /home/toshiba/.rvm/gems/ruby-1.9.2-p290/gems/rsolr-1.0.8/lib/rsolr/client.rb:230:in `adapt_response'
/home/toshiba/.rvm/gems/ruby-1.9.2-p290/gems/rsolr-1.0.8/lib/rsolr/client.rb:167:in `execute'
/home/toshiba/.rvm/gems/ruby-1.9.2-p290/gems/rsolr-1.0.8/lib/rsolr/client.rb:161:in `send_and_receive' 

请帮帮我。谢谢。

2 个答案:

答案 0 :(得分:1)

这里有两件事:

1.仅在string字段支持在太阳黑子中分组。因此,请将searchable块更改为以下内容:

class ProductDetail < ActiveRecord::Base
  belongs_to :category

  searchable do
    text :name
    string :category_id_str do
      category_id.to_s
    end
  end
end

2.更改组参数以反映属性名称更改:

def index
  @search_res1=ProductDetail.search do
    adjust_solr_params do |params|
      params[:group] = true
      params[:"group.field"] = "category_id_str_s"
      params[:"group.format"] = "simple"
    end
  end.execute
  @navurls=@search_res1.results
end

我假设太阳黑子在索引它时会在属性上添加额外的_s

答案 1 :(得分:0)

可能在/ usr / share / solr / conf的schema.xml中缺少类型整数?

这是我的例子:

<schema name="sunspot" version="1.0">
  <types>
    <!-- field type definitions. The "name" attribute is
       just a label to be used by field definitions.  The "class"
       attribute and any other attributes determine the real
       behavior of the fieldType.
         Class names starting with "solr" refer to java classes in the
       org.apache.solr.analysis package.
    -->
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="string" class="solr.StrField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="tdouble" class="solr.TrieDoubleField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="boolean" class="solr.BoolField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="date" class="solr.DateField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="sdouble" class="solr.SortableDoubleField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="sfloat" class="solr.SortableFloatField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="sint" class="solr.SortableIntField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="slong" class="solr.SortableLongField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="tint" class="solr.TrieIntField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="tfloat" class="solr.TrieFloatField" omitNorms="true"/>
    <!-- *** This fieldType is used by Sunspot! *** -->
    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true"/>
  </types>