لا يمكن الاستعادة بسبب فهارس تالفة (مع بعض التلميحات حول كيفية التعامل مع الفهارس التالفة)

كان لهذا أيضًا إدخالان حيث تطابق ‘shiny-server’ مع إدخال واحد فقط بينما تطابق ‘%hiney-server’ مع كلا الإدخالين. لا أرى كيف يساعدني هذا على الفهم، لكنني أعتقد أنك تقول إن الأمر select الذي أقوم به يتوقع إرجاع عنصر واحد فقط ويجلبه من الفهرس متجاهلاً العنصر الآخر، لكن عند استخدامي لـ % فإنه يبحث في الحقول.

discourse=> EXPLAIN ANALYZE select * from tags where name='shiny-server'; 
                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Index Scan using index_tags_on_name on tags  (cost=0.28..8.29 rows=1 width=36) (actual time=0.038..0.040 rows=1 loops=1)
   Index Cond: ((name)::text = 'shiny-server'::text)
 Planning time: 0.129 ms
 Execution time: 0.070 ms
(4 rows)

أشك بشدة في أن أي شخص لا يستطيع استنتاج هذا بنفسه سيجد هذا مفيدًا، لكن… قمت بالعديد من عمليات البحث عن معرفي tag_id المزدوجين اللذين لديهما نفس الاسم وقمت بتنفيذ عمليات مثل:

 TopicTag.where(tag_id: 717).update_all(tag_id: 611)
 Tag.ensure_consistency!
 Tag.find(717) # تأكد من عدم وجوده في أي مواضيع
 Tag.find(717).destroy

ثم قمت بتشغيل reindex table tags; في psql.

ويبدو الآن أنني سأحتاج إلى القيام بذلك بالنسبة لـ users بطريقة مشابهة لما وصفه @bartv. ومع مستخدماتي، أرى مستخدمًا باسم David وآخر باسم david، بالإضافة إلى [Mm]ark.

تم إصلاح هذه الحالات كما يلي:

marks=User.where("username similar to  '[Mm]+ark'").pluck(:id,:username,:created_at)

ثم ابحث يدويًا عن المستخدم Mark الجديد في /admin/users وقم بإعادة تسميته هناك. ثم حاول تشغيل reindex table users; في psql. (sudo su - discourse ثم psql).