Impossibile ripristinare a causa di indici corrotti (con alcuni indizi su come gestire gli indici corrotti)

Anche in questo caso c’erano due voci in cui ‘shiny-server’ corrispondeva a una sola, mentre ‘%hiney-server’ corrispondeva a entrambe. Non vedo come questo mi aiuti a capire, ma penso tu stia dicendo che la mia istruzione select si aspetta che venga restituito un solo elemento, lo estrae dall’indice ignorando gli altri, mentre quando uso % viene eseguita una ricerca nei campi.

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

Dubito fortemente che chiunque non sia in grado di capire tutto questo da solo troverà utile questa spiegazione, ma… ho cercato di individuare le due tag_id con lo stesso nome e ho eseguito operazioni del tipo:

 TopicTag.where(tag_id: 717).update_all(tag_id: 611)
 Tag.ensure_consistency!
 Tag.find(717) # assicurati che non sia associato a nessun argomento
 Tag.find(717).destroy

e poi ho eseguito reindex table tags; in psql.

Sembra ora che dovrò fare lo stesso per users, più o meno come descritto da @bartv. Tuttavia, con i miei utenti, vedo un utente David e un altro utente david, oltre a [Mm]ark.

Questi li ho risolti così:

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

Poi ho individuato il nuovo Mark in /admin/users e ho rinominato l’utente lì. Infine, ho provato a eseguire reindex table users; in psql (sudo su - discourse e poi psql).