为你的WP 定制 ajax 版 Google 自定义搜索[转]
通常我们选用 Google CSE 自定义搜索引擎代替网站自身的搜索服务,可以减轻服务器的负载,但更重要的原因是 Google 搜索有强大的词语分割、智能匹配、拼写纠正功能,甚至能将 “bb” 与 “BlackBerry”, “DM” 与 “桌面管理器” 进行通配,这些算法是我们自己做不到的。我以前在博客中采用 iframe 版的 CSE, 最近把它换成了定制性更强,基于 Google ajax API 的新版,将经验分享一下。本方案优点:
- 不搜索时完全不加载任何相关资源,如 ajax API 库等
- 搜索 url 非常干净,没有多余的参数:search?q=cse
- 方便使用 javascript 对结果样式进一步调整
获取代码
首先需要在 控制面板 – 外观新功能!中选择“搜索元素”模式 (Search element), 再选择一种布局和一种样式。实际上 ajax API 能做的事情非常多,比如就在搜索框下方即时展开结果列表。如果把结果列表悬浮绝对定位,再加上 Search as user Types, 就可以做 apple.com 右上角那种搜索样式了,一边输入一边匹配。
但是考虑到小博客的站内搜索被使用得并不多,我还是选择了两栏布局,将结果列表放在一个专门的页面 /search 中,这样的好处是不搜索的时候可以不加载多余的内容:API 库,JS, CSS 等等。
改造搜索框
先不急着把获取的那一大堆代码往搜索框上放,上面说了,我们要的效果是不搜索的时候不加载。就改造一下模板原生的搜索框就可以了,让它提交用户输入的内容到 /search 这个页面,就这样。我的 header.php 中的搜索框是这样的:
<form action="/search" id="searchbox">
<input type="text" name="q" id="input_search" />
<input type="submit" value="搜索" />
</form>
一个 form 中装一个输入框和一个按钮,关键内容是 action=”/search” 和 name=”q”, 表示将会跳转到 /search?q=搜索的内容.
结果页面
建立一个页面 /search 来放入所有 CSE 代码。页面正文中放入 id=”cse” 的 div, 搜索执行的时候脚本将会改写其中的内容。
<div id="cse">正在搜索...</div>
然后在页面任意位置,比如末尾,写入前面获得的两个 javascript 代码,一个是 ajax API 库 google.com/jsapi, 另一个是以 google.load 开头的一大串。还有些 CSS, 是前面获取代码的时候选择的一种样式。
但这时候还不会自动执行用户之前输入的搜索,要从 url 请求中把搜索词剥离出来,并执行。这里我用了 Kevin Yang 提供的方法,在 draw(‘cse’) 一行后加入:
var match = location.search.match(/q=([^&]*)(&|$)/);
if(match && match[1]){
var search = decodeURIComponent(match[1]);
customSearchControl.execute(search);
}
现在这个搜索系统就可以正常工作了。下面是对脚本的进一步自定义,只逐条说明,不每次都写完整的代码,我会把完整的修改后的脚本放在本文末尾。如果今后代码发生变动,请自行查看我的 搜索结果页 源代码。
不加载 Google 的 CSS
如果要用自己网站的样式,最好是完全不加载 Google 的 CSS, 不然覆盖样式就有得写了。在 google.load 中加入 “nocss” : true 即可。
google.load('search', '1', {language : 'zh-CN' , "nocss" : true });
无结果时显示的文字
由 setNoResultsString 控制,在无结果时将字串写入到 “正在搜索” 处。中文语言下缺省值为“无结果”
customSearchControl.setNoResultsString('什么也没找到,请重试');
结果每页条数
由 setResultSetSize 控制,可选参数为 FILTERED_CSE_RESULTSET 10条;LARGE_RESULTSET 8条;SMALL_RESULTSET 4条。
customSearchControl.setResultSetSize( google.search.Search.SMALL_RESULTSET);
是否在新标签中打开链接
由 setLinkTarget 控制,一般用到的就是 LINK_TARGET_BLANK 和 LINK_TARGET_SELF 两种。
customSearchControl.setLinkTarget( google.search.Search.LINK_TARGET_SELF);
搜索执行完毕后调用其它脚本
由 setSearchCompleteCallback 控制,这是一个相当灵活的命令,我这里用它来将搜索结果标题中的“老肥博客 » 非唠不可”去掉,不然每条标题后面都有这样一句,比较难看。这里我另外加载了 jQuery 来用,当然这不是必需的,如果没有需要就不用了。
customSearchControl.setSearchCompleteCallback(null, function() {
$('input.gsc-input').select();
$('a.gs-title').unwrap().wrap('<h3></h3>').each(function() {
var title = $(this).html().replace(/\|.*/g, '');
$(this).html(title);
});
$('b:contains("...")').contents().unwrap();
});
以上在 setSearchCompleteCallback 中执行了三个步骤:
- 将焦点放到搜索框 input.gsc-input 中并全选文字;
- 将搜索结果标题链接 a.gs-title 先去掉外面的一层 div, 再套在 <h3> 内(这样方便沿用全局 CSS 里面的标题样式),然后对每个标题链接读取内容,替换,写回去;
- 将包含 “…” 的关键字高亮去掉 <b>;(Google 用 <b> 标示关键字,但不知为何 “…” 也都这样标记)
其它
我的搜索页面中还有一些脚本和样式,比如将 CSE 的搜索框伪装成模板原生的输入框,这样可以避免多次搜索的时候重复加载页面;从搜索框中取得当前关键字,写入到右侧提示区;等等,比较特殊,这里就不细写了,反正 Firebug 什么的都一眼看穿。
另外,前面提到 Kevin 的文章中有个技巧很不错,只让单篇文章出现在搜索结果中,排除掉翻页、标签等页面,像我用 .html 作为单篇文章的链接结构就很好办,直接在 CSE 控制面板中设置“包含的网站”为 fis.io/*.html, 就排除了其它形式的链接结构。
微博也是博客,我在 fis.io/*.html 之外还将 twitter.com/fisio/* 编入了索引,在搜索某些内容的时候会看到我的推也在搜索结果中。
最后是我的 /search 页面中相关脚本完整版:
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1', {language : 'zh-CN' , "nocss" : true });
google.setOnLoadCallback(function(){
var customSearchControl = new google.search.CustomSearchControl('015811090669888844099:szzhafqj8_4');
customSearchControl.setResultSetSize(google.search.Search.SMALL_RESULTSET);
customSearchControl.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
customSearchControl.setNoResultsString('<img src="/b.gif"> 什么也没找到,请重试');
customSearchControl.setSearchCompleteCallback(null,function() {
$('input.gsc-input').select();
var searchwords = $('input.gsc-input').val();
$('.p > b').text(searchwords);
$('a.gs-title').addClass('new').unwrap().wrap('<h3></h3>').each(function() {
var title = $(this).html().replace(/\|.*/g, '');
$(this).html(title);
});
$('b:contains("...")').contents().unwrap();
$('.gsc-cursor-current-page').removeClass('gsc-cursor-page');
});
customSearchControl.draw('cse');
var match = location.search.match(/q=([^&]*)(&|$)/);
if(match && match[1]){
var search = decodeURIComponent(match[1]);
customSearchControl.execute(search);
}
});
</script>
康盛已被腾讯收购..消息已经证实..
不信的大家去查查DISCUZ.NET 的 Whois
The following is the information for discuz.net:
Whois Server Version 2.0
Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.
Domain Name: DISCUZ.NET
Registrar: BEIJING INNOVATIVE LINKAGE TECHNOLOGY LTD. DBA DNS.COM.CN
Whois Server: whois.dns.com.cn
Referral URL: http://www.dns.com.cn
Name Server: NS1.DNS.COM.CN
Name Server: NS2.DNS.COM.CN
Status: clientDeleteProhibited
Status: clientTransferProhibited
Updated Date: 22-jan-2009
Creation Date: 07-oct-2002
Expiration Date: 07-oct-2012
Linux Wget 403 Forbidden 问题的解决方案
今天 在LINUX 服务器上下载东西 突然 发现了这个问题..
找了下资料 原来 是因为Wget 默认情况下 没有浏览器访问标识 User Agent
所以被禁止访问了…
解决办法很简单 增加-U 参数 制定访问标识 就可以了
比如
wget -U ‘Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4′ http://www.163.com/k.zip
大刀阔斧砍向DISCUZ7.2!
迅雷 Thunder 5.9.25.1528 去广告 vip6补丁&免注销进高速通道 及 Ayu安装版本
本文介绍了2个关于 Thunder 5.9.25.1528 去广告 的2个版本 大家自己去选择一下吧
版本一: 直接覆盖补丁 补丁针对:
5.9.22.1466 / 5.9.23.1488 /5.9.24.1506 / 5.9.25.1528
4个版本
下载地址 http://u.115.com/file/f96f373d7a
版本二: 迅雷 5.9.25.1528 Ayu 去广告优化安装版
此补丁对于迅雷版 同样适用
迅雷 5.9.25.1528 Ayu 去广告优化版
实现不登陆完美去除所有广告
单进程运行,加快迅雷启动速度。节约系统资源
组件可选安装,实现你的自由定制
优点提示:
可屏蔽迅雷看看广告•可选安装网页浏览器。
更新内容:
1.去掉了工具栏里的“影视”图标。
2.解决了关联BT图标的问题。
3.新建任务时点击“跳过”即立即下载,无需点击两次。
4.修正了不安装“软件助手”时BUG。
5.增加“单进程”安装选项。如果需要ThunderService.exe就不要点选。
6.去除迅雷看看广告。
发个地址..方便大家更新Google chromium…
http://build.chromium.org/buildbot/snapshots/chromium-rel-xp/
下面的LATEST 是最后的更新版本
不过google 的网民们太小强了。。 一天更新好几个版本。。。
审查你的PHP项目..千万别玩绕弯子..千万别沉迷面向对象..那些都是狗屎..
最近由于任务比较忙.. 所以公司 的部分东西 是在网上购买下来的..
后来由于这个东西 不完全符合我们的要求.. 所以要我来做修改..
看了下PHP代码.. 发现了让我很纠结的东西…
不管3721 全部使用类….
这里我不讨论什么面向对象的好与坏问题.. 使用对象开发这个固然好..
因为可以模块化项目.. 加快的开发速度..逻辑上语义更通顺..修改问题 也只要我们修改对象就搞定了.
但是 问题是 明明只要用2行代码就搞定的事情
结果为了所谓的 对象开发 他用了整整100行..其中一大堆的逻辑…还要包含一大堆的类文件..
就这样的方式 真的就是我们要的?
打个比方 就好比 给你一道数学题 让你写一个公式 让它的结果等于2
于是一哥给出的公式是 1+1+5-5+6-6+(2*100-200)=2
看了这个公式 你会怎么想? 呵呵.. 其实1+1 就搞定的事情 为啥 非得搞的那么麻烦….
所以大家 写PHP code的时候 切忌切忌 别干这样的事情…
办公室那点事…
今天来了个新同事.. 坐在我的对面..
本来对我来说..有一个同事和没一个同事 没什么实质性的差别..
但是就是这位 大仙级别的 同事彻彻底底的把我雷到了..
他来公司就职的是界面美工..负责界面 及其DIV+CSS 标准化 浏览器兼容等..
上个美工 在离职前 几个界面 修要修正下.. 我程序上的事情已经早就解决了..
所以其实工作量不是很大.. 然后 这位同仁 用了一天的时间 去修正一个界面..
其实刚来公司..接触新事物.没上手之前这些是可以理解的
但是当我看了 他修正的代码后 有点晴天霹雳的感觉
如下我贴上来这段大致的代码 (经典的来了)
<div>
<td><li>……</li></td>
</div>
咋样.. 大家看明白没…
不说了 写项目了…
谨慎选用你网站服务器空间!本博客暂时转移江苏机房..
在郁闷了近一个月 之后 终于今日下定决心搬迁到我的江苏机房空间上..
不为别的.. 就为百度 不收录
本博客上个月由上海 集思 迁移到韩国空间结果 百度 一篇文章都收录..
期间更新了各种能想到的办法. 包括 301 302 自动跳转等…但是情况还是一样
结果迫于此种情况.. 决定暂时搬回国内… 过阵子 搬入带香港空间下…
最后送上一句 FUCK BAIDU!


最新评论