小网站如何做好站内搜索程序

Posted in PHP, 搜索时代 on August 27th, 2010 by Adam

好的站内搜索对增加网站的用户体验是很有帮助的。但是如何做到简单、高效却也并不是太容易。特别是小网站,完全没有必要去搞什么分词搜索技术。个人觉得考虑到以下几点,就可以很好的满足用户的搜索体验,也能给用户提供匹配度较高的搜索结果。

  • 搜索字段的权重
    数据库里不同字段给予不同的权重,如标题的权重大于内容描述。
  • 关键词匹配相关度积分
    这里有个Mysql的搜索技巧

    SELECT title LIKE ‘%php%’ FROM `zhaiduo_blog`;会返回两种结果1或0,

    那么既然搜索字段有不同权重,我们可以这样得到不同的相关度:

    标题:SELECT (title LIKE ‘%php%’)*10 FROM `zhaiduo_blog`;会返回两种结果10或0
    内容描述: SELECT (description LIKE ‘%php%’)*5 FROM `zhaiduo_blog`;会返回两种结果5或0

    这样我们就可以得到不同字段的相关度得分,从而最终得到总的相关度积分。这也是我们排序的主要依据。

  • 关键字密度
    相关度积分还应该考虑到关键字的密度因素,给予不同积分
  • 搜索结果的展示
    把最匹配的结果展示给用户即可,如果搜索结果太多,可以链接到search more的页面。
  • 错别字纠正提示、拼写检查
    对于常见的关键字错误给予足够的提示是很好的用户体验
  • 搜索关键字的防攻击过滤
    注意关键字的过滤检查,防止sql注入攻击
  • 搜索排序的时效性
    相关性有了,也不要忘记时间的因素,应该避免搜索结果09年排在10年之前
  • 相关匹配内容的展示
    就像Google搜索结果会截取一段相关内容展示出来,可以把搜索的关键字做的更加显眼
Tags:

用OAuth协议测试Twitter API

Posted in PHP on July 25th, 2010 by Adam

去年用Basic Auth做的Twitter API测试已经无法使用,早就看到Twitter推荐OAuth的提示,今天有空用OAuth重写了一下

OAuth的主要目的是尽量减少用户密码在第三方授权过程中的暴露,增强第三方授权的安全性。我使用的是Twitter推荐的twitteroauth,也看了看oauth-php,觉得太复杂。twitteroauth内容少一些,代码看得不会太晕。由于之前写过Blogger的OAuth,所以改起来不是太难;但是不太理解的是user_timeline调用起来太过复杂,本来简单一个网址的调用,现在还要KEY和SECRET,加上用户名和密码才能获取。我的测试只是简单获取Tweets列表以及获取相关的followers,来来去去的token验证显得多此一举。

于是我又索性把connect, redirect和callback集成到了一起,方便我进行简单调用。有意思的是旧的Basic Auth还可以用来更新Twitter,虽然返回的是403。不过,话又说回来,OAuth的应用在越来越多的地方可以看到,掌握它还是很有必要的。

Tags: ,

preg-replace error: regular expression is too large

Posted in PHP on July 22nd, 2010 by Adam

进行模板替换的时候出现如下错误:

Error msg: preg_replace() [function.preg-replace]: Compilation failed: regular expression is too large at offset 62894

根据PHP.net的解释:
这个错误是由PCRE的倒带(backtracking)和递归(recursion)限制造成,可以通过修改ini解决。

print_r(ini_get_all(“pcre”));
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
[pcre.recursion_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
ini_set(‘pcre.backtrack_limit’, ’300000′);

如果使用的虚拟主机,也只有重新修改程序,换一种替换方式了。

究其原因在于我用的模板里面把loop嵌套在if里面,导致if语块的字符串太长造成的,所以应该尽量避免把loop嵌套在if里面。

另外一种常见的错误是:fopen() [function.fopen]: URL file-access is disabled in the server configuration
虚拟主机禁止了fopen非本地文件的访问,解决办法可以用:fsockopen

Tags:

给Discuz7增加修改用户名的功能

Posted in PHP on July 21st, 2010 by Adam

有朋友的discuz论坛升级到7后,发现修改用户名的功能没有了,很是头痛。我写了一个php脚本可以来解决这个问题。主要原理是查询所有数据表是否包含username和author字段,然后将其匹配的用户名修改成新用户名,这个脚本经测试对discuz论坛和UCenter有效。

主要包含上述字段的数据表有:
bbs_activityapplies -> username
bbs_announcements -> author
bbs_forumrecommend -> author
bbs_magicmarket -> username
bbs_members -> username
bbs_mytasks -> username
bbs_posts -> author
bbs_promotions -> username
bbs_ratelog -> username
bbs_reportlog -> username
bbs_rsscaches -> author
bbs_sessions -> username
bbs_threads -> author
bbs_threadsmod -> username
bbs_uc_admins -> username
bbs_uc_feeds -> username
bbs_uc_members -> username
bbs_uc_mergemembers -> username
bbs_uc_protectedmembers -> username
bbs_warnings -> author

需要的朋友也可以在这里下载discuz7_utf8_update_username.php,需要注意的是:

本脚本用于UTF8版discuz7论坛用户名的修改,运行需要管理员登录,用户自己承担使用后果,作者不承担任何责任,请使用者慎重。

Tags:

Corrupt JPEG Error: extraneous bytes before marker 0xd9

Posted in PHP on July 8th, 2010 by Adam

一个Flash项目,一直以来被一个PHP GD模块的问题所困扰,遭到很多用户投诉,无法通过Flash上传图片。我研究过,发现有些图片在Windows下,Photoshop下都可以看见,但是一通过PHP的GD模块来处理,就出现如下错误(例如这张图片):

imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 91 extraneous bytes before marker 0xd9

其中91和0xd9会因为图片的不同而不同,例如Corrupt JPEG data: 4 extraneous bytes before marker 0xd9。

寻找解决方法:

  1. 究其原因应该是gd-jpeg, libjpeg有问题,最快的解决办法就是重新编译libjpeg,但是这对使用虚拟主机的网站来说不太靠谱。
  2. 通过PHP分析有问题的图片头,标记0xd9的错误,但是每张图片的错误标记不同,所以不成立。
    具体原因是由于JPG图片头中EOI marker (0xFF 0xD9) 前的自定义数据部分,PHP GD2无法识别.
  3. 由于虚拟主机的限制,这个也不靠谱
    ini_set(‘gd.jpeg_ignore_warning’, 1);
    imagecreatefromjpeg($file);
  4. 替代工具:ImageMagick,但是空间限制,也只有放弃。

目前暂时没有针对PHP自身的解决方案,另外建议不要使用ImageCreateFromString,也会有这个问题,可以用getimagesize。

困扰的是:老板不管这个是否是BUG,他只要完美,而我却没有答案。

Tags: , ,
RSS Feed