5

ruby on rails 2.3.2 用に Sphinx と Thinking Sphinx をインストールしました。

条件なしで検索すると、検索は正常に機能します。さて、私がやりたいのはタグによるフィルター処理です。acts_as_taggable_on プラグインを使用しているので、Announcement モデルは次のようになります。

class Announcement < ActiveRecord::Base

  acts_as_taggable_on :tags,:category

  define_index do
    indexes title, :as => :title, :sortable => true
    indexes description, :as => :description, :sortable => true
    indexes tags.name, :as => :tags
    indexes category.name, :as => :category

    has category(:id), :as => :category_ids
    has tags(:id), :as => :tag_ids
  end

何らかの理由で、次のコマンドを実行すると、予想とは関係のないアナウンスが 1 つだけ表示されます。たくさんの発表があるので、その代わり多くの結果を期待していました。

Announcement.search params[:announcement][:search].to_s, :with => {:tag_ids => 1}, :page => params[:page], :per_page => 10

何かが間違っていると思います。正しく検索されていません。

何が起こっているのか、誰かが私に手がかりを与えることができますか?

ありがとう、ブライアン

4

3 に答える 3

11

Thinking Sphinx は、モデル内の関連付けに依存しています。一般的な状況では、関連付けの下にインデックス定義を配置するだけで済みます。

act_as_taggable_onプラグインを使用すると、モデル ファイルにタグ関連の関連付けがなく、書き込み時に

インデックス tags.name, :as => :tags

TS は次のように解釈します。

CAST(`announcements`.`name` AS CHAR) AS `tags`

(私の場合、development.sphinx.conf の sql_query を見てください)。モデルのお知らせに属性名があり、インデックスを再構築するときにエラーが発生しないと思います。

しかし、私たちは次のことを期待しています:

CAST(GROUP_CONCAT(DISTINCT IFNULL(`tags`.`name`, '0') SEPARATOR ' ') AS CHAR) AS `tags`

と:

LEFT OUTER JOIN `taggings` ON (`announcements`.`id` = `taggings`.`taggable_id`)  
LEFT OUTER JOIN `tags` ON (`tags`.`id` = `taggings`.`tag_id`) AND taggings.taggable_type = 'Announcement'

機能させるには、インデックスを再構築する前に、モデルにタグ関連の関連付けを追加するだけです。

class Announcement < ActiveRecord::Base

  acts_as_taggable_on :tags,:category

  has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag, :class_name => "ActsAsTaggableOn::Tagging",
            :conditions => "taggings.taggable_type = 'Announcement'"
  #for context-dependent tags:
  has_many :category_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag",
          :conditions => "taggings.context = 'categories'"

define_indexメソッドでは:

indexes category_tags(:name), :as => :tags
has category_tags(:id), :as => :tag_ids, :facet => true

コントローラーで:

@announcement_facets = Announcement.facets params[:search], :with => {:tag_ids => [...]} 
@announcements = @announcement_facets.for.paginate( :page => params[:page], :per_page => 10 )
于 2010-02-03T23:43:49.773 に答える
6

次のように単純にインデックスを定義することがわかりました。

Class Thing < ActiveRecord::Base    

acts_as_taggable

     define_index do
        ..other indexing...
        indexes taggings.tag.name, :as => :tags
     end
end

うまくいきました。

于 2011-08-08T18:27:54.593 に答える
2

1つの可能性は、TSが混乱する可能性があるため、tag_idsのタイプを:multiとして宣言する必要があることです(これはhttp://groups.google.com/group/thinking-sphinx/browse_thread/thread/9bd4572398f35712/14d4c1503f5959a9? lnk = gst&q = yanowitz#14d4c1503f5959a9)。

しかし、タグ名を使用して検索してみませんか?例えば、

Announcement.search params[:announcement][:search].to_s, :conditions => {:tags => "my_tag"}, :page => params[:page], :per_page => 10

または、複数のタグを検索する必要がある場合:

Announcement.search( "#{params[:announcement][:search].to_s} (@tags my_tag | @tags your_tag)", :page => params[:page], :per_page => 10 )

(余談ですが、ユーザーが指定したクエリを使用する前に、sphinx-control-charactersをサニタイズ/削除することをお勧めします)。

デバッグのために、私はコンソールに入り、クエリを可能な限り削除します(ページネーション引数を削除し、クエリ( ""を実行するだけ)など)。

于 2010-01-19T22:30:13.407 に答える