سؤال

لقد قمت بتثبيت أبو الهول والتفكير أبو الهول لروبي على القضبان 2.3.2.

عندما أقوم بالبحث بدون شروط ، يعمل البحث بشكل جيد. الآن ، ما أود القيام به هو تصفية العلامات ، لذلك ، حيث أستخدم المكون الإضافي ACTS_AS_TAGGABLE_ON ، يبدو نموذج الإعلان الخاص بي مثل هذا:

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

لسبب ما ، عندما أقوم بتشغيل الأمر التالي ، فإنه سيحضر إعلانًا واحدًا فقط ، لا علاقة له بما أتوقعه. لدي العديد من الإعلانات ، لذلك كنت أتوقع الكثير من النتائج بدلاً من ذلك.

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

أعتقد أن هناك خطأ ما ، وهو لا يبحث بشكل صحيح.

هل يمكن لأي شخص أن يعطي فكرة عن ما يحدث؟

شكرا يا براين

هل كانت مفيدة؟

المحلول

التفكير أبو الهول يعتمد على الجمعيات في النموذج. في المواقف الشائعة ، عليك فقط وضع تعريف الفهرس أقل جمعياتك.

مع ACTS_AS_TAGGABLE_ON المكون الإضافي ليس لديك جمعيات متعلقة بعلامات في ملف النموذج وعندما تكتب

الفهرسة العلامات. اسم ،: AS =>: العلامات

TS يفسرها مثل:

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

(انظر إلى sql_query في التطوير. sphinx.conf ، في حالتي). أفترض أن لديك اسم السمة في إعلان النموذج ولا تتعرض للخطأ عند إعادة بناء فهرس.

لكننا نتوقع:

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 )

نصائح أخرى

لقد وجدت أن تحديد الفهرس ببساطة:

Class Thing < ActiveRecord::Base    

acts_as_taggable

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

عملت بشكل جيد.

أحد الاحتمالات هو أنك تحتاج إلى إعلان نوع TAG_IDS على النحو التالي: Multi لأن TS يمكن أن يتم الخلط بينه (اكتشفت هذا للتو هنا 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 من الاستعلام المقدم من المستخدم قبل استخدامه).

بالنسبة لتصحيح الأخطاء ، كنت سأذهب إلى وحدة التحكم وتجريد استعلامك قدر الإمكان (القضاء على حجج ترقيم الصفحات ، وحتى الاستعلام (فقط "" ") ، وما إلى ذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top