注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

淘尽网 官方博客

淘尽网http://www.tao3w.com做最好的比价网站

 
 
 

日志

 
 
关于我

淘尽网 http://www.tao3w.com 做最好的比价网站,做最好的数据抓取专家。

网易考拉推荐

sphinx使用介绍  

2012-06-25 15:58:53|  分类: spider |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

到今天为止校内论坛Discuz)上的主题数量已经到达了40w,所有回复约500W。随着数据量的增大,DZ自带的站内搜索给数据库的带来的压力越来越大,甚至会导致数据库停止服务(MyISAM在SLOW Query和update并发问题)。取代站内搜索,我们使用了google的自定义搜索服务,google的速度非常快,但是对于论坛来说,Google不能返回实时的搜索结果,而且也无法定制搜索(如安装标题、作者、内容)。

所以,我们将尝试使用sphinx来解决这个问题。先看看sphinx是怎样工作的:

sphinxII

  1. sphinx有两个主要进程indexer和searchd。indexer,正如其名,她的任务是从数据库(或者其他的数据源)收集原始的数据,然后建立相应的索引。searchd则是通过读取indexer建立的索引来响应客户端的请求。如果用图书馆来打比方的话,一个是按照索书号整理数目的工作人员,一个是帮你从书架上取书的人。
  2. 要让sphinx为你工作的话,需要做几件事(在配置文件中完成):
    1) 告诉sphinx,数据源在哪儿(配置source,对应MySQL的话,就是填写其主机名、登录用户、密码等)
    2) 建立“索引任务”。告诉indexer针对数据源的哪一部分建立索引,建立索引时数据源的编码、最小索引长度等细节信息
  3. 执行indexer,完成前面配置文件中的“索引任务”;启动searchd服务。

这样你的应用就可以通过sphinx提供的API来搜索数据库中的数据了,sphinx会为你返回对应数据的主键。

MySQL提供了LIKE子句可以很好的实现对数据库中数据的模糊搜索,使用LIKE很多时候可以帮助我们解决一些站内搜索的问题。但是随着MySQL中数据量逐渐增加,LIKE模糊查询的效率将成为MySQL数据库的主要压力。这时候尝试使用sphinx,可以很好的帮你解决这个问题。本文将继续介绍具体如何部署sphinx。在阅读本文前,建议先浏览sphinx使用介绍(前篇),或者跳过本文直接RTFM

+++++++++++++++++++++++++++++++++
正文:
+++++++++++++++++++++++++++++++++

一、下载,安装

下载sphinx-0.9.8.1.tar.gz(在撰写本文时,0.9.8.1是最新版)

安装过程够简洁,在GNU/Linux 2.6.24 Ubuntu 8.04.3 LTS:

tar zxvf sphinx-0.9.8.1.tar.gz cd sphinx-0.9.8.1 ./configure    #这里你可以加上你的安装路径如:./configure --prefix=/usr/local/sphinx make sudo make install

二、配置sphinx的数据源

sphinx主要有两个进程indexer和searchd,在他们运行前,我们需要配置好sphinx.conf文件,告诉他们如何工作。(默认配置文件的路径/usr/local/etc/)

首先,我需要配置一个数据源(source),告诉indexer到哪儿去获取原始数据。例如,我们将配置一个名为mars的数据源:

cd /usr/local/etc/ cp sphinx.conf.dist sphinx.conf vi sphinx.conf source mars {  type = mysql  sql_host = localhost  sql_user = sphinxuser  sql_pass = sI9sWb2uFYxz  sql_db = discuzdb  sql_sock = /var/run/mysqld/mysqld.sock  sql_port = 3306  …… 

这里我配置了一个名为mars的数据源。数据类型是mysql,表示indexer将从mysql中获取我要的数据(除了mysql,sphinx还支持很多种类的数据源,如文本,xml文档等)。这里还配置了访问该数据库的主机名、用户、密码、数据库名、数据库端口、以及连接该数据库的socket文件。(注意:配置文件中有一些多余的source需要删除,如source src1throttled : src1)

现在indexer知道去那个数据库取数据了,但是具体取哪个数据表中的哪些列的数据呢?好,我们继续。编写需要索引的数据列的SQL,例如我需要索引字段为cdb_thread.threadtitle,那么sphinx需要用到的SQL是:

 sql_query = SELECT tid AS id, threadtitle FROM cdb_threads; } 

我们注意到,我们的query中一个时id字段,第二个才是我们需要索引的内容。sphinx有这样的规则,你的Query中获取的第一个字段必须是一个唯一的数字(使用自增的字段是很方便的),后面才是你需要索引的内容(另外,也可以你想排序的字段,这里暂不介绍)。

到这,我们就完成了一个数据源的配置,这里的我们的数据源名字是mars(如果需要,我们还可以配置更多数据源,例如Juliet等)。

三、配置sphinx的索引任务

现在有了:数据源以及需要索引的内容。接下来,我们需要在配置文件中,指定一个某个索引任务去索引前面的内容。这个索引任务应该包含:数据源用哪一个、数据数据放在什么目录下、以及其他的一些索引算法的细节参数。

index explorer{  source = mars              #还记得前面建立的source吧?  path    = /var/data/sphinx/catalog    #任务的工作空间在哪,sphinx需要一些空间建立索引  morphology              = stem_en      #搜索的一些“词法”  我也不知道这是什么!:-(   min_word_len            = 3     min_prefix_len          = 0     min_infix_len           = 3    } 

四、sphinx搜索配置

最后,还剩一点点工作。那就是配置searchd,你甚至保持默认就可以了。searchd中定义了一些搜索行为,例如当搜索结果集太大的时候,最多返回多少个(默认1000),等等。

搞定配置文件,98%的事情就算完成了。

五、启动、使用Sphinx

所有工作都已经就绪了,现在是倒计时启动的时间了。

执行indexer,对数据进行一次索引。

sudo /usr/local/bin/indexer [--rotate] --config /usr/local/etc/sphinx.conf explorer
//这里的explorer就是前面配置文件中一个索引任务

启动搜索相应进程(searchd):

sudo mkdir -p /var/data/sphinx
sudo /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf &

好了,搞定。我们来测试一下吧:(早就迫不及待了吧)

例如查找字符串 “ENG”
sudo usr/local/bin/search --config /usr/local/etc/sphinx.conf ENG
看看你的搜索结果

如果搜索结果正常,到这,我们就完成全部的sphinx配置和启动工作。在接下来的一篇文章中我将介绍如果使用php向sphinx发送搜索请求,并处理返回结果。

  评论这张
 
阅读(584)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017