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