No se puede restaurar debido a índices corruptos (con algunas pistas sobre cómo tratar índices corruptos)

Este también tenía dos entradas donde ‘shiny-server’ coincidía solo con una, pero ‘%hiney-server’ coincidía con ambas. No veo cómo esto me ayuda a entenderlo, pero creo que estás diciendo que el select que estoy haciendo espera que solo se devuelva un elemento, lo extrae del índice e ignora el otro, pero cuando uso el %, busca en los campos.

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 filas)

Dudo bastante que alguien que no pueda resolver esto por sí mismo encuentre esto útil, pero… hice una serie de búsquedas para encontrar los dos tag_id con el mismo nombre y realicé operaciones como:

 TopicTag.where(tag_id: 717).update_all(tag_id: 611)
 Tag.ensure_consistency!
 Tag.find(717) # asegurarse de que no esté en ningún tema
 Tag.find(717).destroy

y luego ejecuté reindex table tags; en psql.

Y parece que ahora tendré que hacer lo mismo para users, algo así como @bartv describió. Aunque con mis usuarios, veo un usuario David y otro usuario david, además de [Mm]ark.

Esos los solucioné así:

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

Luego, busqué el nuevo Mark en /admin/users y renombré al usuario allí. Después, intenté ejecutar reindex table users; en psql. (sudo su - discourse y luego psql).