2010-01-17 27 views
5

Tôi đã cài đặt Sphinx và Thinking Sphinx cho ruby ​​trên đường ray 2.3.2.Tư duy Sphinx và actions_as_taggable_on plugin

Khi tôi tìm kiếm mà không có điều kiện, tìm kiếm hoạt động ok. Bây giờ, những gì tôi muốn làm là lọc theo thẻ, vì vậy, khi tôi đang sử dụng plugin acts_as_taggable_on, mô hình Thông báo của tôi trông như thế này:

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 

Đối với một số lý do, khi tôi chạy lệnh sau, nó sẽ chỉ mang lại một thông báo, điều đó không liên quan gì đến những gì tôi mong đợi. Tôi có nhiều thông báo, vì vậy tôi mong đợi rất nhiều kết quả thay thế.

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

Tôi đoán cái gì là sai, và nó không tìm kiếm một cách chính xác.

Có ai có thể cho tôi biết đầu mối về những gì đang xảy ra không?

Cảm ơn, Brian

Trả lời

11

Nhân sư suy nghĩ dựa vào các liên kết trong mô hình. Trong các trường hợp phổ biến, bạn chỉ phải đặt định nghĩa chỉ mục below các liên kết của bạn.

Với acts_as_taggable_on plug-in bạn không có các hiệp hội thẻ liên quan đến trong tập tin mô hình và khi bạn viết

chỉ số tags.name,: như =>: Thẻ

TS diễn giải nó như sau:

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

(xem sql_query trong development.sphinx.conf, trong trường hợp của tôi). Tôi cho rằng bạn có tên thuộc tính trong Thông báo mô hình và không gặp lỗi khi xây dựng lại chỉ mục.

Nhưng chúng tôi mong đợi:

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

và:

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' 

Để có được những điều làm việc chỉ cần thêm các hiệp hội thẻ liên quan đến trong mô hình của bạn trước khi bạn xây dựng lại chỉ mục:

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'" 

Trong define_index phương pháp:

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

Trong điều khiển:

@announcement_facets = Announcement.facets params[:search], :with => {:tag_ids => [...]} 
@announcements = @announcement_facets.for.paginate(:page => params[:page], :per_page => 10) 
2

Một khả năng là bạn cần phải khai báo kiểu cho tag_ids như: đa vì TS có thể bị lẫn lộn (tôi chỉ phát hiện ra điều này ở đây http://groups.google.com/group/thinking-sphinx/browse_thread/thread/9bd4572398f35712/14d4c1503f5959a9?lnk=gst&q=yanowitz#14d4c1503f5959a9).

Nhưng tại sao không sử dụng tên thẻ để tìm kiếm? Ví dụ:

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

Hoặc, nếu bạn cần phải tìm kiếm nhiều thẻ:

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

(như sang một bên, bạn có thể muốn để khử trùng/xóa Sphinx-control-ký tự từ truy vấn người dùng cung cấp trước sử dụng nó).

Để gỡ lỗi, tôi sẽ chuyển sang bảng điều khiển và xóa truy vấn của bạn càng nhiều càng tốt (loại bỏ đối số pagination, ngay cả truy vấn (chỉ cần thực hiện ""), v.v.).

6

tôi thấy rằng chỉ đơn giản là xác định các chỉ số như sau:

Class Thing < ActiveRecord::Base  

acts_as_taggable 

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

làm việc tốt.

+0

Cảm ơn, điều đó đã hiệu quả. –

Các vấn đề liên quan