用Sphinx驱动WordPress搜索
乐无线lewuxian.com最初的搜索是基于wordpress自身的数据库搜索功能,在数据量剧增的情况下,搜索速度奇慢无比,因此改用Sphinx来完成对Wordpress的搜索请求。
大的框架:采用sphinx-for-chinese + WordPress Sphinx Search Plugin + Redis 搭配来实现搜索性能的优化。其中:
sphinx-for-chinese 在sphinx基础上增加了CJK字符的搜索支持。WordPress Sphinx Search Plugin 是Wordpress插件,用于集成Wordpress和Sphinx;Redis用于搜索操作和结果的缓存。
1、sphinx-for-chinese安装配置
最初直接使用了sphinx 最新版本来实现搜索,为解决中文(CJK)搜索问题,按照 Using Sphinx search engine with Chinese, Japanese, and Korean language documents 提供的方案,大致注意事项如下(对sphinx.conf中每一项source段):
1)、charset_type :Wordpress数据库编码采用utf-8编码,Sphinx 的 charset_type 设置为 utf-8。
2)、charset_table :设置 CJK 专用的 charset_table ,简单起见直接拷贝cjk_index_example.zip 例子提供的charset_table 。
需要注意的是:由于charset_table 的内容太多,无法放在一行,需要分成多行,sphinx.conf的续行标识为“\”,在续行符“\”后一定不能有空格等其他符号,只能为回车换行符号 (\r\n)。在配置过程中,习惯性在”\”后面加了空格,结果在执行indexer时候,报莫名其妙的错误。
3)、ngram_chars:设置CJK分词符(CJK Ngram Characters ),仍直接拷贝cjk_index_example.zip 例子提供的是ngram_chars。
4)、把 ngram_len 设置为 1,目前版本只支持设置为1 。
按照以上步骤设置为,Sphinx倒是能够对Wordpress的中文文档建索引、搜索了,但由于建立索引和搜索时候都是按照1分法索引查询的,导致搜索效果并不好。一般中文搜索按照二分法效果好得多。
因此寻找sphinx中文搜索的更优解决方案。目前可选的似乎就是:sphinx-for-chinese 和coreseek 。简单对比,感觉coreseek对sphinx调整较大,不像sphinx-for-chinese那样简洁,因此选择了sphinx-for-chinese。
在CentOS 5服务器上安装最新版本的sphinx-for-chinese-2.2.1-dev-r4311.tar.gz ,在make时候报错,换成sphinx-for-chinese-2.1.0-dev-r3361.tar.bz2 倒是比较顺利。
编译安装倒是比较简单,sphinx-for-chinese官方文档说得比较清楚。
值得注意的是官方说明文档提到的xdict_1.1.txt 需要从google code下载http://code.google.com/p/sphinx-for-chinese/downloads/list ,并没有包含在发布包中,也没有在官网http://www.sphinx-search.com/ 提供下载。
2、WordPress Sphinx Search Plugin安装配置
参照 WordPress Sphinx Search Tutorial 这篇文章,完成WordPress Sphinx Search Plugin的安装配置。
sphinx与wordpress集成,所使用的配置文件 :sphinx.conf (http://www.yeeach.com/sphinx.conf)
注意事项:
1)、由于lewuxian.com对每一个公众号在wp_users中都有一个对应的作者,要支持对author的搜索需要对对应主题theme增加支 持页面。简单起见,采用如下的变通方式:将作者的user_login和user_nicename拼接到wp_main_posts和 wp_delta_posts的source中,这样在建索引和搜索时候可以支持对author的索引和搜索,不需要做其他复杂处理。
sql_query = select \
p.ID*2+1 as ID, \
0 as comment_ID,\
p.ID as post_ID,\
p.post_title as title, \
concat(p.post_content ,’ ‘,u.user_nicename,’ ‘,u.user_login) as body, \
t.name as category, \
IF(p.post_type = ‘post’, 1, 0) as isPost, \
0 as isComment, \
IF(p.post_type = ‘page’, 1, 0) as isPage, \
IF(p.post_type = ‘post’, 0, IF(p.post_type = ‘page’, 1, 2)) as post_type, \
UNIX_TIMESTAMP(post_date) AS date_added, \
GROUP_CONCAT(DISTINCT tag_t.name) as tags \
from \
wp_posts as p \
left join \
wp_users u on (p.post_author=u.ID) \
…
3、搜索操作及结果的缓存
由于在搜索后展示搜索结果详情时候需要查询数据库,目前服务器资源有限,为减缓数据库压力,采用Redis对搜索操作及结果进行缓存,可参考 使用Redis突破WordPress性能瓶颈 。
4、其他配置
1)、crontab配置
1 1 * * * /usr/local/sphinx-for-chinese/bin/indexer –rotate –config /data/www/wwwroot/www.lewuxian.com/wp-content/uploads/sphinx/sphinx.conf –all
*/5 * * * * /usr/local/sphinx-for-chinese/bin/indexer –config /data/www/wwwroot/www.lewuxian.com/wp-content/uploads/sphinx/sphinx.conf wp_delta –rotate
*/5 * * * * /usr/local/sphinx-for-chinese/bin/indexer –config /data/www/wwwroot/www.lewuxian.com/wp-content/uploads/sphinx/sphinx.conf wp_stats –rotate
2)、searchd
放到/etc/init.d/searchd ,然后执行:
chkconfig –add searchd
chkconfig –level searchd 345
3)新搭建的wordpress,执行indexer –rotate –config –all 报max_id=’(null)’ 和min_id=’(null)’错误
using config file ‘/data/www/wwwroot/www.lewuxian.com/wp-content/uploads/sphinx/sphinx.conf’…
indexing index ‘wp_main’…
ERROR: index ‘wp_main’: sql_query_range: max_id=’(null)’: must be positive 32/64-bit unsigned integer.
total 33471 docs, 294394782 bytes
total 80.890 sec, 3639444 bytes/sec, 413.78 docs/sec
indexing index ‘wp_delta’…
ERROR: index ‘wp_delta’: sql_query_range: min_id=’(null)’: must be positive 32/64-bit unsigned integer.
解决办法:
select min(id) from wp_posts;
select min(comment_id) from wp_comments;
如果min(comment_id)为NULL,则随便找一篇帖子回复一下即可。
5、参考资料:
Using Sphinx search engine with Chinese, Japanese, and Korean language documents
原文链接:http://www.yeeach.com/post/1247
FIREFOX / IE Word-Wrap:Word-Break问题
用的是wpzone.net的fresh wordpress主题,很烦人的是在Internet Explorer下如果content或sidebar的内容部分一行的内容过长,则经常出现sidebar被挤到页面最下端的情况,而在firefox下没有此种现象。一般出现在如下几种情况:
- 图片太大超过了width
- url太长没有正常换行,超过了width
- 代码太长没有正常换行,超过了width
究其原因是因为对于无空格连续长字符,IE与Firefox将它看成是一个长单词了,因此不会自动换行。
对于IE,可以通过IE专有的CSS属性word-wrap即可实现自动换行:word-wrap:break-word;
对于Firefox,CSS2标准并没有定义类似word-wrap的属性,可以通过overflow属性将撑出的部分隐藏:overflow:hidden
因此为了兼容性,可以使用如下方法:
word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
修改fresh theme的style.css文件,在#content和#sidebar中增加上述属性以及pre属性
#content { color:#000; display:inline; float:left; font-size:14px; line-height:1.5em; text-align:left; width:635px; margin:13px 0 0 20px; padding:0 0 20px 0px; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } #sidebar { display:inline; background-color:#fff; float:right; font-size:12px; width:230px; line-height:1.4em; padding:20px 20px; margin:15px 20px 15px 0; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ }
pre { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ }
另外对于firefox和opera可以采用javascript方式来避免overflow:hidden的弊端,具体实现可以参考:
Script word-wrap to Firefox – updated version
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
参考文档:
http://users.tkk.fi/~tkarvine/pre-wrap-css3-mozilla-opera-ie.html
http://elmicoxcodes.blogspot.com/2007/06/script-word-wrap-to-firefox-updated.html
http://jiarry.bokee.com/5871385.html
http://bbs.blueidea.com/thread-2692909-1-1.html
http://www.positioniseverything.net/explorer/expandingboxbug.html
Technorati 标签:wordpress,css,overflow,word-wrap,break-word
Pligg安装过程记录
打算使用pligg用于自己日常的网摘使用,以统一网摘内容,避免零散在各个网摘站点上。
这此记录一下自己在基于dreamhost虚拟主机环境下配置pligg的安装过程。
环境说明:
dreamhost虚拟主机环境、linux系统、mysql数据库
wordpress作为缺省主页程序,安装路径为yeeach.com,将pligg的程序安装到wordpress目录下,pligg的安装路径为yeeach.com/digg
1、安装pligg
直接用了dreamhost提供的One-Click Installs的pligg安装包(9.8版本),安装完成后
chmod 644 digg/libs/dbconnect.php
rm -rf digg/install
2、在wordpress中新增page作为导航,并将新增页面的点击操作重定向到pligg
假设pligg路径为http://www.yeeach.com/yeeach-digg
在.htaccess中配置RewriteRule,只在RewriteBase /后增加
RewriteRule yeeach-digg /digg [L]
.htaccess完整的内容如下:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule yeeach-digg /digg [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
3、备份digg库并修改字符集
由于dreamhost的mysql缺省字符集为latin1,需要修改为utf8.
登录phpmyadmin或直接用mysqldump导出digg库为sql文件,手工将DEFAULT CHARSET从latin1替换为utf8
4、删除digg库的库表(虚拟主机用户没有权限直接drop库,只能删除表),导入替换字符集后的sql
5、确认digg表的字符集为utf8_general_ci
6、以god/12345登录pligg,修改口令
7、下载中文语言包
从 关于Pligg 9.8中文乱码解决方案(Chinese gibberish on Pligg 9.8 solutions)下载libs.zip包,解压后上传到libs/下
8、到“后台管理”的“修改语言”,按照自己需要调整术语说法
9、到“后台管理”的“设定配置”处修改“Searching”为2 = uses MySQL LIKE and is much slower, but returns better results. Also supports “*” and “-”
10、关于前后台界面汉化
前台界面汉化:采用pligg站点上下载的lang.conf已经汉化了前台,需要用pligg下载的汉化包覆盖libs/lang.conf;
后台界面汉化:后台管理界面的汉化需要修改数据库。可以从http://bpdig.com/forum/viewtopic.php?t=73下载后台汉化包,建议不要汉化,汉化很不好用,如要修改,修改前备份数据库后,出错后好回滚。
参考资料:
http://blog.bpdig.com/?cat=1
http://forums.pligg.com/pligg-mods/8892-pligg-9-8-chinese-gibberish-pligg-9-8-solutions.html
dreamhost虚拟主机购买记
在dreamhost上购买了一个虚拟主机,记录一下整个过程,供有一天成为写传记时候,让传记作者帮写回忆录时候说明是多么的与时俱进,竟然冒着被河蟹掉的危险,突破重围,投奔革命圣地。(呵呵,my god,伟大任务的传记就是这样出炉的)!
1、选择篇
简单看了hostgator,ixwebhosting,godaddy,bluehost后还是决定在hostmonster.com 和dreamhost.com 之间选择,也无什么具体原因,主要没有兴趣一个一个比较价格、服务等,查看各种评论和比较,更加迷茫,还是顺便选择一个吧,免得心烦。
最后在hostmonster和dreamhost之间选择了dreamhost,主要是觉得hostmonster一年的费用$83.4的价格比dreamhost的$22.4(使用Promo Code: adminis97)贵了一大截。hostmonster两年包费用为$4.95*24=118.8,dreamhost两年包的费用为:$214.8-$97=$117.80。价格上还是dreamhost占优。
2、支付篇
直到注册时候才发现dreamhost.com只支持google checkout,晕倒,前面看其他帖子明明说dreamhost.com支持paypal,应该是最近与google达成了所谓的“战略合作伙伴”。只好在注册一个google checkout,只不过也好,也体验一下这些支付厂商的服务细节。
- 为何一定要用第三方支付,而不直接使用信用卡支付?
直接用信用卡支付要向虚拟主机提供商提供自己信用卡的号码、有效日期、CVC等敏感信息,这些信息如果泄露出去,对于信用卡资金的安全、用户私人信息等都有重大的安全漏洞。通过第三方支付工具,这些敏感信息只驻留在第三方支付厂商处。支付时候虚拟主机厂商与支付厂商间只传递订单金额(Amount)、商家交易号(Transaction ID)、支付商订单号(Order)、支付时间等基本信息,并不存在泄露用户信用卡相关信息,因此相对安全。另外如果要评比虚拟主机提供商和像google checkout、paypal这样的第三方支付商的可信度,我宁愿选择第三方支付商,毕竟支付的专业性、安全性是他们的立足之本。
注册过程倒没有什么特别的,只不过在选择Location时候还没有China或PRC可供选择,只能选择Hong Kong了事。我自己用的是招行的Visa信用卡,注册验证过程倒比paypal便捷。
另外注册时候要求填入信用卡的验证号CVC(Card Verification Code),是指信用卡背面的签名最后的3位的数字。
PS.
google checkout的帐号应该是根据google account生成的,从设计上来说对应客户(customer)-用户(user)-帐户(account)这电信所谓的三户模型而言,account=google checkout ,user=google account。
3、注册篇
3.1、折扣
注册前最好google一下,看有无最新的折扣信息。 google关键词“Dreamhost promo code”,找个折扣号。
注意不要使用google.cn,出来的很多垃圾信息。可以使用http://www.google.com/ncr 或者http://www.google.com/search?hl=en&q=Dreamhost+promo+code
3.2、注册
注册过程倒没有什么技巧,主要有几个地方备忘一下:
“Now for the up-sell:”中的所有东西在注册时候时候都可以不选择,尤其是SSL Secure Certificate,注册时候还以为必须选择此项,才能够使用诸如F-Secure SSH登录,由于必须同时选择“Unique IP”服务,觉得太贵,也就没有选择,打算就telnet+ftp方式进行维护算了,后来发现其实仍然可以用SSH方式进行登录上传文件。SSL协议支持两种传输过程,需要用户验证的双向验证传输(双向认证,需要客户端安装数字证书),和不需要用户验证的单向验证传输(服务器端认证,不需要客户端安装证书)。此处的“SSL Secure Certificate”应该是指“不需要用户验证的单向验证传输”。
- 关于Promo Code or email of who referred you:
要看仔细了,要在此处输入Promo Code。我使用的是“adminis97”,可以在原有方案折扣的基础上享受$97的优惠。
4、开通篇
4.1、DreamHost Account Approval Notification
dreamhost的开通速度还不错,我付款后,大致才过了30分钟就收到了开通信“DreamHost Account Approval Notification!”,内容如下:
(Account #123456)*** Please visit the Wiki for help getting started :
http://wiki.dreamhost.com/index.php/Special:Search?fulltext=Search&search=getting%20startedHello xxx,This is just a note to let you know that your account with DreamHost has
been approved! Below you will find a summary of relevant services for
your account that will be activated within the next 30 minutes:Domain yeeach.com : Web service on dione.dreamhost.comFTP User 'xxx', password 'xxx' on machine dione.dreamhost.comMail User 'xxx', password 'xxx'As each of these services is activated, you will receive another email
that more fully details its use.If you are transfering an existing domain registration to DreamHost for
hosting - or have not yet registered your domain and plan to do so with a
registrar other than DreamHost - remember to use the following domain nameserver information when submitting your registration/transfer:Primary name server: ns1.dreamhost.com 66.33.206.206Secondary name server: ns2.dreamhost.com 208.96.10.221Tertiary name server: ns3.dreamhost.com 66.33.216.216Finally, you can administer virtually every aspect of your account fromthe web panel at:https://panel.dreamhost.com/Your email: xxxx@xx.comPassword: xxxAny questions about your account can be submitted from the 'Support'
area of our web panel.Thank you for choosing DreamHost!
Sincerely,The Happy DreamHost Approval Team--support@dreamhost.comhttps://panel.dreamhost.com/"We host your dreams"
FAX: +1-714-990-2600
4.2、管理控制台
- 登录管理控制台:
https://panel.dreamhost.com/
-
查看订购的服务:
查看invoice:https://panel.dreamhost.com/index.cgi?tree=billing.invoice&域名管理:https://panel.dreamhost.com/index.cgi?tree=domain.manage&
-
安装应用:
dreamhost缺省提供了日常建站需要的各种应用(包括:wordpress、joomla、Mediawiki等),再不用一个一个下载、上传、安装了。这些应用可以通过One-Click Installs安装:https://panel.dreamhost.com/index.cgi?tree=goodies.installer&mysql管理:https://panel.dreamhost.com/index.cgi?tree=goodies.mysql&crontab:https://panel.dreamhost.com/index.cgi?tree=goodies.cron&subversion:https://panel.dreamhost.com/index.cgi?tree=goodies.svn&Jabber:https://panel.dreamhost.com/index.cgi?tree=goodies.jabber&
-
修改缺省密码:
由于缺省生成ftp、mail的密码为随机密码,因此把这些改成自己熟悉的安全密码。
-
常用地址备忘:
1、SSH或telnet、ftp地址:虚拟主机名称,例如www.yeeach.com 或dione.dreamhost.com
dione.dreamhost.com 是虚拟主机的实际存放地址,后端应该有负载均衡、cluster,能够根据用户id负载到相应的虚拟主机上,
2、管理终端登录界面:https://panel.dreamhost.com/
3、wordpress管理登录界面:http://www.yeeach.com/wp-admin
Technorati 标签:虚拟主机,virtual host,google checkout,paypal,dreamhost,hostmonster,wordpress
leave a comment