出家如初,成佛有余

用Sphinx驱动WordPress搜索

Posted in 技术相关 by chuanliang on 2014/04/14

乐无线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.confhttp://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

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

sphinx-for-chinese官方文档

Sphinx速成指南

 

原文链接:http://www.yeeach.com/post/1247

 

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: