Невозможно восстановить из-за повреждённых индексов (с некоторыми подсказками, как справиться с повреждёнными индексами)

В этом случае тоже было две записи, где ‘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).