sphinx详细安装配置⽂档
Sphinx
SphinxSphinx
Sphinx详细安装配置
详细安装配置详细安装配置
详细安装配置
项⽬中需要重新做⼀个关于商品的全⽂搜索功能,于是想到了⽤Sphinx,因为需
要中⽂分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议
这两个中选择⼀个,暂时不要选择原版Sphinx(对中⽂的⽀持不是很好).⼜因为
服务器所⽤ MySQL在当时编译时并没有编译Sphinx扩展,⽽重新编译MySQL并
加⼊Sphinx暂时⼜⽆法实现(项⽬⽤到了多台服务器,在不影响现有业务的情
况下不可能去重新编译MySQL的),所以采⽤的是程序通过API来外部调⽤
Sphinx.Sphinx⾃带的API有 PHP,Python,Ruby,Java等众多版本,所以基本也够
⽤了,本⼈使⽤的编程语⾔是PHP所以下⽂的条⽤⽰例采⽤的是PHP版的API.
⼀.安装及配置Sphinx及准备测试数据
1.安装前的准备⼯作
(1)请确认安装了MySQL,Gcc及常⽤的开发环境包
(2)下载sphinx-for-chinese-1.10.1及中⽂分词词典xdict_1.1(下⾯两个
⽅式,选⼀个即可)
[1]到sphinx-for-chinese官⽅下载(强烈推荐使⽤这个)
cd /usr/local/src
wget -c
lecode/files/sphinx-for-chinese-1.1
0.
wget -c
lecode/files/xdict_1.
[2]到本站下载(国外vps,性能不怎么好,⽽且速度慢,不推荐,只做备
⽤)
cd /usr/local/src
wget -c
b332/source/soft/sphinx-for-chinese-1.10.1/sphinx-for-chin
ese-1.10.
wget -c
b332/source/soft/sphinx-for-chinese-1.10.1/xdict_1.1.tar.g
z
2.安装sphinx-for-chinese-1.10.1
cd /usr/local/src
tar zxvf sphinx-for-chinese-1.10.
cd sphinx-for-chinese-1.10.1-dev-r2287
#MySQL安装在默认位置的使⽤如下命令
./configure --prefix=/usr/local/sphinx-for-chinese-1.10.1 --with-mysql 如果出现如下图所⽰错误,表明MySQL不是安装在默认位置,请执⾏下⾯的命令# 如果MySQL不是安装在默认位置(特别是⾃⼰编译MySQL的,请注意),请指定
MySQL的相关位置,主要是MySQL的include和lib⽬录 (Sphinx编译的时候要
⽤到⾥⾯的.h头⽂件),--with-mysql-includes及--with-mysql-libs就是为了
指定这两个位置的
./configure --prefix=/usr/local/sphinx-for-chinese-1.10.1
--with-mysql-includes=/usr/local/webserver/mysql/include/mysql
--with-mysql-libs=/usr/local/webserver/mysql/lib/mysql
显⽰如下图所⽰内容时,表⽰可以接着执⾏下⾯的make及make install命令
make
make install
mysql下载后怎么安装不了#最后执⾏命令
ls /usr/local/sphinx-for-chinese-1.10.1/
如果显⽰bin,etc和var三个⽬录表⽰安装成功
3.让Sphinx⽀持中⽂分词
cd /usr/local/src
tar zxvf xdict_1.
/usr/local/sphinx-for-chinese-1.10.1/bin/mkdict xdict_
xdict_1.1 哪⾥
都可以,包含的时候4Q 驆如果提⽰bin/mkdict: error while loading shared libraries:
libmysqlclient.so.16等错误(以下命令中的libmysqlclient.so.16.0.0的位
置取决于我们mysql编译安装的位置)
ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16.0.0
/usr/lib/libmysqlclient.so.16
再次执⾏
/usr/local/sphinx-for-chinese-1.10.1/bin/mkdict xdict_
xdict_1.1
#提⽰Chinese dictionary was successfully created!表⽰中⽂分词词典⽣成
成功
cp xdict_1.1 /usr/local/sphinx-for-chinese-1.10.1/etc/xdict_1.1
4.配置Sphinx
vi /usr/local/sphinx-for-chinese-1.10.1/f
输⼊以下内容
# sphinx基本配置
# 索引源
source goods_src
{
# 数据库类型
type = mysql
# MySQL主机IP
sql_host = localhost
# MySQL⽤户名
sql_user = sphinxuser
# MySQL密码
sql_pass = sphinxpass
# MySQL数据库
sql_db = sphinx
# MySQL端⼝(如果防⽕墙有限制,请开启)
sql_port= 3306
# MySQL sock⽂件设置(默认为/tmp/mysql.sock,如果不⼀样,请指定)
sql_sock = /tmp/mysql.sock  剉a    # MySQL检索编码(数据库⾮utf8的很可能检索不到)      sql_query_pre = SET NAMES UTF8
# 获取数据的SQL语句
sql_query = SELECT goods_id,goods_id AS
goods_id_new,goods_name,goods_color,goods_name AS
goods_name_search,goods_color AS goods_color_search From goods_test
# 以下是⽤来过滤或条件查询的属性(以下字段显⽰在查询结果中,不在下
⾯的字段就是搜索时要搜索的字段,如SQL语句中的
goods_color_search,goods_name_search)
# ⽆符号整型
#goods_id为主键,如果加在这⾥在⽣成索引的时候会报attribute
'goods_id' not found,这⾥⽤goods_id_new来变通
sql_attr_uint = goods_id_new
# 字符串类型
sql_attr_string = goods_name
sql_attr_string = goods_color
# ⽤于命令界⾯端(CLI)调⽤的测试(⼀般来说不需要)
#sql_query_info = SELECT * FROM goods_test Where goods_id =
$goods_id;
}
# 索引
index goods
{
# 索引源声明
source = goods_src
# 索引⽂件的存放位置
path = /usr/local/sphinx-for-chinese-1.10.1/var/data/goods
# ⽂件存储模式(默认为extern)
docinfo = extern
# 缓存数据内存锁定
mlock = 0
# 马⽒形态学(对中⽂⽆效)
morphology = none
# 索引词最⼩长度
min_word_len = 1  ict_
xdict_1.1
#提⽰Chines
Q > ?    # 数据编码(设置成utf8才能索引中⽂)
charset_type = utf-8
# 中⽂分词词典
chinese_dictionary =
/usr/local/sphinx-for-chinese-1.10.1/etc/xdict_1.1
# 最⼩索引前缀长度
min_prefix_len = 0
# 最⼩索引中缀长度
min_infix_len = 1
# 对于⾮字母型数据的长度切割(for CJK indexing)
ngram_len = 1
# 对否对去除⽤户输⼊查询内容的html标签
html_strip = 0
}
# 索引器设置
indexer
{
# 内存⼤⼩限制默认是 32M, 最⼤ 2047M, 推荐为 256M 到 1024M之间
mem_limit = 256M
}
# sphinx服务进程search的相关配置
searchd
{
# 监测端⼝及形式,⼀下⼏种均可,默认为本机9312端⼝
# listen = 127.0.0.1
# listen = 192.168.0.1:9312
# listen = 9312
# listen = /var/run/searchd.sock
# search进程的⽇志路径
log = /usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.log
# 查询⽇志地址
query_log = /usr/local/sphinx-for-chinese-1.10.1/var/log/query.log
# 读取超时时间
read_timeout = 5
sql_sock = /tmp/mysql.sock  剉/Q  ?    # 请求超时市时间
client_timeout = 300
# searche进程的最⼤运⾏数
max_children = 30
# 进程ID⽂件
pid_file =
/usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.pid
# 最⼤的查询结果返回数
max_matches = 1000
# 是否⽀持⽆缝切换(做增量索引时需要)
seamless_rotate = 1
# 在启动运⾏时是否提前加载所有索引⽂件
preopen_indexes = 0
# 是否释放旧的索引⽂件
unlink_old = 1
# MVA跟新池⼤⼩(默认为1M)
mva_updates_pool = 1M
# 最⼤允许的⽹络包⼤⼩(默认8M)
max_packet_size = 8M
# 每个查询最⼤允许的过滤器数量(默认256)
max_filters = 256
#每个过滤器最⼤允许的值的个数(默认4096)
max_filter_values = 4096
# 每个组的最⼤查询数(默认为32)
max_batch_queries = 32
}
# Sphinx配置⽂件结束
中⽂在linux下可能会看到乱码,不⽤管
5.创建测试数据库并添加测试内容(请先连上⾃⼰的MySQL数据库),在MySQL中
执⾏如下命令  -1.10.1/var/log/query.log
# $Q  鈲 mysql> create database sphinx collate 'utf8_general_ci';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'%' identified
by 'sphinxpass';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'localhost'
identified by 'sphinxpass';
mysql> use sphinx;
mysql> CREATE TABLE IF NOT EXISTS `goods_test` (\
`goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id',\  `goods_name` varchar(255) NOT NULL COMMENT '商品名称',\
`goods_color` varchar(60) NOT NULL COMMENT '商品颜⾊',\
PRIMARY KEY (`goods_id`)\
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='商品表,sphinx⽰例' AUTO_INCREMENT=11 ;\
mysql> INSERT INTO `goods_test` (`goods_id`, `goods_name`, `goods_color`) VALUES\
(1, '热卖时尚双肩背包', '⿊⾊'),\
(2, '热卖时尚电脑双肩背包', '灰⾊'),\
(3, '缤纷炫动时尚化妆包', '⿊⾊'),\
(4, '缤纷炫动时尚化妆包', '蓝⾊'),\
(5, '缤纷炫动时尚化妆包', '粉红'),\
(6, '极致性感⼥款衬衫', '⿊⾊'),\
(7, '个性宣⾔男款短袖衬衫', '蓝⾊'),\
(8, '个性宣⾔男款短袖衬衫', '红⾊'),\
(9, '个性宣⾔男款短袖衬衫', '绿⾊'),\
(10, '个性宣⾔男款短袖衬衫', '⿊⾊');\
好了,万事俱备了,可以开始实战操作Sphinx了
⼆.实战操作Sphinx
1.建⽴索引(如果配置⽂件有改动,应该重新⽣成索引⽂件,如果下⾯第3点中的searchd进程已经开启的话,应先关闭)
#⽣成goods索引[需要确保要连接的主机的MySQL数据库正常运⾏,并且3306
端⼝可以访问]
/usr/local/sphinx-for-chinese-1.10.1/bin/indexer -c
/usr/local/sphinx-for-chinese-1.10.1/f goods
#如果配置⽂件⾥有多个索引,需要⼀次⽣成使⽤--all参数
/usr/local/sphinx-for-chinese-1.10.1/bin/indexer -c
/usr/local/sphinx-for-chinese-1.10.1/f --all
2.在linux命令⾏下测试搜索
/usr/local/sphinx-for-chinese-1.10.1/bin/search -c
/usr/local/sphinx-for-chinese-1.10.1/f 个性⿊⾊ sql_port= 3306
# MySQL sock⽂件设置(膖Q Gx?
搜索结果如下图⽰
3.开启守护进程(供API调⽤,如果配置⽂件改动,应重新启动这个进程,不然搜
到的数据不是最新)
/usr/local/sphinx-for-chinese-1.10.1/bin/searchd -c
/usr/local/sphinx-for-chinese-1.10.1/f &      #执⾏后记
得再按回车
# 防⽕墙需要开放9312端⼝供外部访问9312端⼝(3306是MySQL的端⼝)
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 9312 -j ACCEPT
/etc/rc.d/init.d/iptables save
三.外部API调⽤(PHP版)
注意使⽤时前提是执⾏了如下命令,⽽且防⽕墙也开启了9312端⼝
/usr/local/sphinx-for-chinese-1.10.1/bin/searchd -c
/usr/local/sphinx-for-chinese-1.10.1/f &      #执⾏后记
得再按回车
1. 把
/
usr/local/src/sphinx-for-chinese-1.10.1-dev-r2287/api/sphinxapi.php
弄出来,和下⾯第2点中的search.php放在同级⽬录(这个只是⽰例,放在哪⾥都可以,包含的时候到正确的sphinxapi.php的位置即可)
2.编辑search.php⽂件,内容如下(具体内容请读者⾃⼰定,我这⾥只是⽰例)  <?php
header('Content-Type: text/html;charset="UTF-8"');
if ($_GET) {
// 关键词
$keyword = urldecode(trim(strip_tags($_GET['keyword'])));
if ($keyword) {
// 包含Sphinx的api⽂件        require_once 'sphinxapi.php';
// sphinx服务器地址
$server = '192.168.128.130';
// 端⼝
$port  = 9312;
// 索引名为*时表⽰搜索所有索引
$indexName = 'goods';
// 分页页码
$page = intval($_GET['page']) > 1 ? intval($_GET['page']) : 1;
// 每页显⽰的数量
$pageSize = 30;
$sphinx = new SphinxClient();
// 建⽴连接
$sphinx->SetServer($server, $port);
/
/ 连接超时时间(⾮常必要,⽐如sphinx服务器挂了等异常情况) 单
位为s,秒
$sphinx->SetConnectTimeout(3);
// 最⼤查询时间单位为ms,毫秒
$sphinx->SetMaxQueryTime(2000);
// 按分页取结果
$sphinx->SetLimits(($page-1)*$pageSize, $pageSize); //第⼀个参
数为offset,第⼆个参数为limit
// 模式
// $sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
// 取到的原始数据
$orgDatas = $sphinx->Query($keyword, $indexName);
// 调试⽤,如果有错误的话,可以打印$errors的值
$errors = $sphinx->GetLastError();
var_dump($errors);
echo '<pre>';
var_dump($orgDatas);
/* // 下⾯是对结果的处理
$datas = array('goods'=>array(),'total'=>0);
if ($orgDatas['total'] > 0) {
$datas['total'] = $orgDatas['total'];
foreach ($orgDatas['matches'] AS $val) {
$val['attrs']['goods_id'] =
$val['attrs']['goods_id_new'];
unset($val['attrs']['goods_id_new']);
$datas['goods'][] = $val['attrs'];
}
}
var_dump($datas);  ?
./configure --prefix=/usr/local/sphinx-for_Q lT?        */
}
} else {
echo '<form method="get"><input type="type" name="keyword"><input type="submit" value="商品搜索"></form>';
}
>
代码可以点此处下载
b332/source/soft/sphinx-for-chinese-1.10.1/sphinxapi.tar.g
z
更多详细配置请参看
/usr/local/sphinx-for-chinese-1.10.1/f.dist⽂件⾥⾯有
包括实时索引,增量索引等很多内容,英⽂原版的,很详细  ?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。