0

これは簡単なはずですが、うまくいきません。

公開されているすべての製品を取得したいと考えています。

次のコードは機能しており、公開された製品のみが返されます。

@products = Product.search do
  with(:published, true)
  with(:facet_tag).all_of(facets) unless facets.nil?
  fulltext q do
  end
  facet :facet_tag
  paginate :page => 1, :per_page => 8
end

全文部分を削除すると、結果がまったく返されません。

次のコードで公開されたすべての製品を返したいのですが、コードは結果をまったく返しません。@products.results は nil になります。

@products = Product.search do
  with(:published, true)
  with(:facet_tag).all_of(facets) unless facets.nil?
  facet :facet_tag
  paginate :page => 1, :per_page => 8
end

sunspot から公開されたすべての製品を取得するにはどうすればよいですか?

4

1 に答える 1

0

質問に提示されたコードは機能しています。この問題は、solrconfig ファイルに加えた変更が原因で発生しました。edismax と呼ばれる requestHandler を追加しました。デフォルトのリクエストハンドラーに設定されていて、全文検索が機能していたため、sunspot がそれを使用していると想定していました。

代わりに、Sunspot は dismax と呼ばれるリクエスト ハンドラーを期待していますが、そのようなリクエスト ハンドラーが構成されていないため、Solr が:検索クエリを理解できなかったため、すべてのドキュメントを取得できませんでした。

実際、Sunspot は Solr の完全な抽象化を目指しており、solr 構成ファイルを変更する必要がないため、これはまったく問題になりません。Solr をもう少し高度に使用する場合、Sunspot はまだ存在しないため、変更が必要になることがよくあります。幸いなことに、adjust_solr_params 関数を使用して solr パラメータを変更することができます。

コードを次のように変更して問題を解決します。

@products = Product.search do   
  with(:published, true)
  with(:facet_tag).all_of(facets) unless facets.nil?
  fulltext q do
  end
  adjust_solr_params do |p|       
    p[:'defType'] = 'edismax'     
  end
  facet :facet_tag
  paginate :page => 1, :per_page => 8
end

このようにして、dismax クエリ パーサーの代わりに edsimax クエリ パーサーを使用するように solr に要求しています。

于 2013-01-15T22:40:56.673 に答える