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