这个案例中也有两条记录,其中’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
然后在 psql 中执行reindex table tags;。
现在看起来,我还需要对users表进行类似操作,正如@bartv 所描述的那样。不过在我的用户中,我看到了一个名为 David 的用户和一个名为 david 的用户,还有[Mm]ark。
我是这样修复这些问题的:
marks=User.where("username similar to '[Mm]+ark'").pluck(:id,:username,:created_at)
然后在/admin/users中找到新的 Mark 用户并在那里重命名该用户。接着在 psql 中尝试执行reindex table users;(先执行sudo su - discourse,再执行psql)。