Sphinx在Windows下的安装和使用(数据源是MySQL)

2017-12-27 09:15:00
linefo
原创
1188
Sphinx通常是安装在Linux中的,但为了方便学习和测试,这里安装在Win下。
Win和Linux环境中的配置不是完全通用的,所以这里所做的配置不能成为你搭建网络服务器上Sphinx的参考。
本教程基于sphnix2.2.1版本(X64)


在这之前,推荐你先看一下Sphinx的工作原理:

http://www.linefo.com/index.php/article/28.html


安装和使用


下载Win下使用的sphinx:http://sphinxsearch.com/downloads/current/

然后解压到一个你需要的目录下:

(bin目录:命令程序和配置文件;data目录:索引存放目录;log:日志目录;share:API函数例子和一些其他资料;根目录下是一些帮助的文件)



先导入测试数据

sphinx提供的测试数据是example.sql文件。

(该sql文件作用于名为test的数据库,并会建立documents和tags两个表)



该版本中,有两个样例配置文件,分别是sphinx.conf.in(全面)和sphinx-min.conf.in(简略)

我们将sphinx-min.conf.in复制到bin目录下,并修改名称为sphinx.conf

然后合理修改该配置文件:


#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source src1
{
	type			= mysql #数据源,这里是mysql
	sql_host		= localhost # 数据库服务器
	sql_user		= root # 数据库用户
	sql_pass		=  # 数据库密码(这里空密码不能用'')
	sql_db			= test # 数据库
	sql_port		= 3306	# 端口
	sql_query_pre	= SET NAMES utf8 # 在执行sql_query之前执行的查询
	
	# 需要包含主键,以及要做sphinx全文索引的字段(和MySQL中的全文索引无关)
	sql_query		= SELECT `id`,`title`,`content` FROM `documents`
}


index test1
{
	source			= src1 # 索引数据源,指前面source的名称
	path			= D:/sphinx/data/ # 放索引文件的目录
	charset_table     = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F # 指定utf-8的编码表
	ngram_len		= 1 # 简单分词,只支持0和1,如果要搜索中文,请指定为1+
	ngram_chars      = U+3000..U+2FA1F # 需要分词的字符,如果要搜索中文,去掉前面的注释
}


index testrt
{
	type			= rt
	rt_mem_limit		= 128M # RT索引使用的内存限制值

	path			= /var/data/testrt
	
	rt_field		= title
	rt_field		= content
	rt_attr_uint		= gid
}


indexer
{
	mem_limit		= 128M # 索引内存限制值
}

# 搜索服务配置

searchd
{
	listen			= 9312 # 监听端口
	listen			= 9306:mysql41 # 监听端口
	log			= D:/sphinx/log/test.log # 指定监听日志文件
	query_log		= D:/sphinx/log/query.log # 指定查询日志文件
	read_timeout		= 5 # 客户端读操作超时时间
	max_children		= 30 # 并行执行搜索的数目
	pid_file		= D:/sphinx/log/searchd.pid # 进程id文件
	# seamless_rotate		= 1 # 无缝轮转索引,增大消耗内存减少轮转的时间(Win下启动searchd需要注释这个)
	preopen_indexes		= 1 # 索引预开启,是否强制打开所有索引文件
	unlink_old		= 1 # 索引轮换成功后,是否删除以.old为扩展名的索引拷贝
	workers			= threads # for RT to work # 多处理模式,win下默认为threads,linux下默认为form
}



配置文件详解:http://www.linefo.com/index.php/article/26.html


【其他】

在log目录下新建了几个对应的日志文件:




后面的操作我们需要使用命令行来操作。


首先进入bin目录:


bin目录下主要是存放命令行工具、配置文件等

indexer.exe:索引生成器

searchd.exe:作为守护进程,处理查询并返回结果

indextool.exe:

wordbreaker.exe:?


接着建立一个索引,执行indexer.exe test1,test1是配置文件里面的index test1。


在data目录下,可以看到生成的索引文件:


【PS】

在看他人的资料时,可以在命令行下使用search命令进行测试查找。

但我下载的Win下的2.2版本,无法使用这个命令。


如果是3.0以上的版本,可能会出现ssleay32.dll丢失的问题,而下载它以后又出现0x00.......错误,无解。


在PHP中使用


首先要运行searchd程序,并且不要关闭该终端,它是需要一直运行的守护进程。


一般来说,PHP是没有安装Sphinx扩展的

所以我们需要到:http://pecl.php.net/package/sphinx 中下载扩展,记得选择对应PHP版本的扩展,同时扩展还区分nts与ts版。

然后到php.ini中修改配置信息,重启PHP,接着运行phpinfo()函数,可以看到:


我们运行下面的脚本:

(记得学习一下PHP手册中关于Sphinx的API函数)



	$Sphinx = new SphinxClient(); // 使用Sphinx类
	$Sphinx->SetServer("localhost", 9312); // 服务器地址和端口(端口在Searchd的配置那里)
	$Sphinx->SetMatchMode(SPH_MATCH_ANY); // 设置为 “匹配查询词中的任意一个” 模式
	$Sphinx->SetArrayResult(true); // 设置搜索结果集以数组形式返回
	$result = $Sphinx->query("two", "*"); // 查询字符串和索引名称,*表示所有
	var_dump($result);exit;


【结果】

查看配置文件的sql_query所查询的字段,id作为返回的结果[主键],title和content做了Sphinx的全文索引,作为被查询的字段。

我们拿到id以后,再用该id直接从数据库中查找数据。


【数据源】

【其他】

Sphinx配置文件中,ngram_len该项开启也只能支持简单的中文索引,一般来说是没办法满足我们的要求的。

我们需要使用coreseek(对Sphinx进行了封装,加上了中文分词机制),才能进行正常的中文索引。

这块后面再补上

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277