Python+Sphinx+MYSQL
什么是Sphinx
sphinx是一款基于SQL的全文检索引擎,提供java、python、PHP、ruby等语言的API。可以基于数据库(如mysql)提供比数据库本身更优的全文检索服务。
安装Sphinx(Ubuntu)
1.首先需要安装MYSQL,MYSQL的安装这里不再赘述,网上教程很多.
2.直接到Sphinx官网下载对应的压缩包,下载之后,解压到/usr/local/文件夹下即可,这是免安装的压缩包.当然也可以去Github下载源码,使用源码进行安装.
使用源码安装的命令如下
#1.解压压缩包
$ tar xzvf sphinx-???.tar.gz
$ cd sphinx
#2.安装前的配置
./configure
--prefix, 用于指定安装位置,例如 --prefix=/usr/local/sphinx
--with-mysql, 当自动检测失败时,用于指定去哪里找MYSQL的依赖和库文件;
--with-static-mysql, 通过静态连接的MYSQL支持来构建Sphinx;
--with-pgsql, 用于说明哪里去找到PostgreSQL的依赖和库文件.
--with-static-pgsql, 通过静态连接的PostgreSQL支持来构建Sphinx;
#3.构建二进制文件
$ make
#4.安装
$ make install
下文中,我们将以来自官网的免安装版本进行部署和测试.
3.解压或者安装之后,在sphinx文件夹下会有一些子文件夹
api/ 存放着不同语言调用Sphinx的API,包括java,ruby,PHP,python
doc/ 存放着Sphinx的文档
etc/ sphinx配置文件,不同的索引可以写不同的配置文件
bin/ sphinx程序,其中有建立索引的程序:indexer, 搜索守护进程:searchd
var/ 一般用了放置indexer索引好的文件
让Sphinx可以工作的一个基本流程如下:
1.获取可执行文件(安装之后在bin/文件夹下).
2.创建sphinx.conf运行配置文件
3.执行一次indexer --all,来初始化索引.
4.运行searchd守护进程,用于监听检索.
5.执行查询.
6.定期执行indexer --all --rotate 来更新索引.
(看起来)So easy是不是,Let's go!.
运行官方测试样例
其中etc/文件夹下应该有三个文件:example.sql sphinx.conf.dist sphinx-min.conf.dist.它们是是Sphinx官方给出的样例配置文件.其中example.sql文件,用于在本地MYSQL中创建一个用于测试的数据库;sphinx.conf.dist是Sphinx启动的配置文件,而sphinx-min.conf.dist则是精简版的启动配置文件.
运行官方测试样例的步骤如下:
-
启动本地MySql服务,创建一个名为test的数据库(example.sql中指定的),然后执行example.sql脚本创建documents和tags两张表
-
因为我们对检索引擎没有什么特殊的需求,所以直接使用最简单的配置文件就行。直接使用sphinx-min.conf.dist做我们的配置文件,创建该文件的副本并更名为sphinx-min.conf,修改其中的mysql的host和user和password,如果是本地一数据库,官方建议host使127.0.0.1而非localhost。
这里附上一篇博客,专门讲Sphinx配置文件的. -
在sphinx安装路径下的bin文件夹下打开终端,以速度权限执行以下命令(如果是在windows系统下,要先以管理员权限打开CMD,然后再定位到bin文件夹下):
#这一条命令是用来根据conf文件创建文档的倒排索引的
./indexer -c ../etc/sphinx-min.conf --all
#索引创建成功之后,就可以启动检索引擎,监听端口9306和9312
./searchd -c ../etc/sphinx-min.conf
执行完这两条命令之后,searched进程就会以守护进程的形式开始工作,监听目标端口。其中9306端口是可以被mysql命令连接执行sphinxql(Sphinx的SQL)的,一般用于调试;而9312端口一般用来API调用。
- 下面我们尝试一下MySql连接9306端口,执行下面这条命令
mysql -h127.0.0.1 -P9306 -uroot -p
按照提示输入密码之后,就进入了经过Sphinx包装之后的“伪MySql”。我们执行下面这条SQL
show tables;
会看到test1和testrt两张“表”。这是由indexer创建的普通索引和增量索引。
我们再执行下面这条SQL