|
趁着时间停止,研究一下搜索机制
搜索帖子标题(title)的关键词为a+b 的Base64编码为YSti
搜索范围为全部版块.
后台所进行的MySQL查询为 (为了解释方便,我进行了分行)
- SELECT searchid, dateline,
- ('10'<>'0' AND uid='2861' AND 1681876835-dateline<'10') AS flood,
- (searchstring='forum|title|YSti|0||\\\'5\\\',\\\'6\\\',\\\'14\\\',\\\'7\\\',\\\'11\\\',\\\'12\\\',\\\'13\\\',\\\'9\\\',\\\'10\\\',\\\'2\\\'|0|0|all|||0' AND expiration>'1681876835') AS indexvalid
- FROM common_searchindex
- WHERE srchmod='2' AND ('10'<>'0' AND uid='2861' AND 1681876835-dateline<10) OR (searchstring='forum|title|YSti|0||\\\'5\\\',\\\'6\\\',\\\'14\\\',\\\'7\\\',\\\'11\\\',\\\'12\\\',\\\'13\\\',\\\'9\\\',\\\'10\\\',\\\'2\\\'|0|0|all|||0' AND expiration>'1681876835')
- ORDER BY flood
复制代码 先看第一行 SELECT 语句用于从表 common_searchindex 中选择特定的列。被选中的列是 searchid、dateline、flood 和 indexvalid。
第二行('10'<>'0' AND uid='2861' AND 1681876835-dateline<'10') AS flood 创建一个名为 flood 的新列,它返回一个布尔值 true 或 false。它检查 uid 为 2861 的当前用户(我)是否在最近 10 秒内进行了搜索。如果是,则 flood 设置为 true,否则设置为 false。
第三行创建另一个名为 indexvalid 的新列,它也返回一个布尔值 true 或 false。它检查searchstring是否有效且expiration未过期,则将 indexvalid 设置为 true,否则设置为 false。
第四行指定了从中选择数据的表,即 common_searchindex。
第五行指定了数据必须满足的条件才能被选中。条件有点复杂。
('10'<>'0' AND uid='2861' AND 1681876835-dateline<10):这个子条件检查uid为2861的当前用户是否在最近10秒内进行了搜索。
第六行“ORDER BY flood”将选中的数据按“flood”列升序排列。 |
|