التفكير sphinx و acts_as_taggable_on البرنامج المساعد
-
21-09-2019 - |
سؤال
لقد قمت بتثبيت أبو الهول والتفكير أبو الهول لروبي على القضبان 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 من الاستعلام المقدم من المستخدم قبل استخدامه).
بالنسبة لتصحيح الأخطاء ، كنت سأذهب إلى وحدة التحكم وتجريد استعلامك قدر الإمكان (القضاء على حجج ترقيم الصفحات ، وحتى الاستعلام (فقط "" ") ، وما إلى ذلك).