请选择 进入手机版 | 继续访问电脑版

游迹天下-移动本地生活平台服务提供商

 找回密码
 立即注册
搜索
查看: 1674|回复: 0

乐无线采用sphinx,大幅提升搜索性能

[复制链接]

1199

主题

1201

帖子

4211

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4211
发表于 2014-4-14 03:44:02 | 显示全部楼层 |阅读模式
  乐无线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速成指南

原文来源:[url]http://www.yeeach.com/post/1247[/url]


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|游迹,懂你,懂世界!   游迹天下官方微信:uooji_com,游迹语音助手:uoojihelper|网站地图

GMT+8, 2019-1-22 07:49 , Processed in 0.155176 second(s), 40 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表