求问无Query String的搜索弊端的处理方法

2013-07-27 09:48:02 +08:00
 Windweller
我是用PHP写后台程序的新人。。最近在给自己的博客写搜索功能。

在网上浏览的时候,发现有种不用Query String(这个大概就是?=XXX的通过搜索地址传输的方式吧)的方式。这种方式在数据库内生成搜索结果,然后返回成类似1、2、3的id号,然后用uri调取id号,由此取得搜索结果。。不知道我讲清楚没。。

这种方法固然很好——尤其对中文搜索,不用一大堆可怕的字符,同时通过存储到数据库,搜索者也可以将搜索结果存到书签栏。

但我担心这种方法会产生如下问题:

1. 数据库会不会变得过大。
2. 会不会让网站更不稳定?(比如不停的让数据库存储新的搜索结果。。)(假设我已经对XSS攻击有很好的防范了)
3. 需要隔一段时间就把搜索表清空一次吗?(如果这样。。书签肯定就都没效果了。。)(而且如何让MySQL针对某个表三个月或是一年清空一次?当然也可以写PHP代码规定存储量超过多少就都删了。。)

- -!最近感觉不是一般的笨了。。以及真的是才学PHP没太久。。不要喷得太厉害了谢谢。
3290 次点击
所在节点    程序员
10 条回复
ksc010
2013-07-27 09:55:04 +08:00
不是很明白
是不是说 我搜索 name=jack&max-age=20
而程序把这个条件存储起来,并且有个key 比如是23
这样我访问 search.php?key=23
实际上就是 search.php?name=jack&max-age=20
Windweller
2013-07-27 10:03:04 +08:00
@ksc010 嗯。。我用的是uri处理。。所以最后结果看起来是search.php/23/。。基本思路就是把存储条件给存进数据库里。
ksc010
2013-07-27 10:10:30 +08:00
有大站这样用么
我知道的是ecshop搜索的时候 先把搜搜条件给base64成一长串字符
看起来就像是这样search.php?encode=YToyOntzOjgDoic2VhcmNoX2VuY29kZW1lIjtpOjEzNzQ4OTA4OTA7fQ==
qiayue
2013-07-27 10:18:28 +08:00
注意,你写的是博客程序,就自己一个人用的程序,访问量能大到哪里去,每天几十万 UV 算是顶天了,估计一开始每天几百个上千个 UV 就不错了。

你所有的担心都是猜测而已,不是实际发生的,完全没必要提前去优化。

另外,反而,有些访问量很大的网站(比如电影天堂),他故意这么做,因为他把搜索结果给缓存起来了,网站用起来更快了。
rwx
2013-07-27 10:35:01 +08:00
这种方式一般是缓存起来避免同条件搜索的时候翻页还要再次检索数据库吧?
个人博客的话不是访问量超大或者数据量超大基本用不上这种优化方式。
而且直接使用google站内搜索会更好。
Windweller
2013-07-27 11:03:45 +08:00
@qiayue 是缓存的搜索结果,而不是搜索字符吧?(我目前只知道存搜索字符的方法。。)请问搜索结果是怎么存到数据库的呢?
darasion
2013-07-27 11:20:00 +08:00
撸主不必担心这事儿。甚至也不需要缓存啥东西。因为一个人做的不可能搞这么多东西进去。
放心,如果你的访问量上来了也许你就开始雇人做事当老板了。
即便是访问量和数据量巨大,也是有办法的。
中国的网页总数,也就 几个1000000亿 左右,都有办法存的。
shinwood
2013-07-27 11:36:23 +08:00
可参见 Discuz 对帖子搜索的缓存机制,用一个search 表缓存搜索到的帖子的 tid,显示到前端用 WHERE IN 的方式,这种情况可能适合搜索的帖子不是百万千万级的,不然搜索表够大。

至于定期清空就更容易了,在 search 表中加一个 expiry 字段,设定失效秒数,后台定期手工运行或者写个清理 hook 到程序中即可。
shinwood
2013-07-27 11:36:23 +08:00
可参见 Discuz 对帖子搜索的缓存机制,用一个search 表缓存搜索到的帖子的 tid,显示到前端用 WHERE IN 的方式,这种情况可能适合搜索的帖子不是百万千万级的,不然搜索表够大。

至于定期清空就更容易了,在 search 表中加一个 expiry 字段,设定失效秒数,后台定期手工运行或者写个清理 hook 到程序中即可。
qiayue
2013-07-27 11:37:20 +08:00
@Windweller
搜索结果也是可以缓存的,我说其中一种方法:
特定网站的搜索结果其实是一串同类 ID ,比如博客的搜索结果是文章 ID ,电影天堂的是影视剧 ID 。
你把这一串 ID 跟搜索字符串的关系存进数据库,再把每一个对象按照 ID 缓存。

搜索请求过来,根据字符串获取到搜索结果 ID ,再从缓存中根据 ID 一个一个把对象找出来,发给页面显示。

关于缓存请看 范凯 的 Web应用的缓存设计模式 http://robbinfan.com/blog/38/orm-cache-sumup
Loveyuki
2013-08-01 20:10:03 +08:00
小型网站怎么做都不会出现太大的性能问题。

大型网站肯定实现了自己的搜索引擎,也不会纠结于此。

所以如果你喜欢这样就可以去试着做做看。要勇于尝试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX