Sphinx中文分词详细安装配置及API调用实战手册
2016-08-31 12:57
771 查看
转载自:http://www.xuejiehome.com/blread-1283.html
Sphinx中文分词详细安装配置及API调用实战手册[转载]
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用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(sphinx-for-chinese官方下载)及中文分词词典xdict_1.1
view source
print?
2.安装sphinx-for-chinese-1.10.1
view source
print?
如果出现如下图所示错误,表明MySQL不是安装在默认位置,请执行下面的命令
#如果MySQL不是安装在默认位置(特别是自己编译MySQL的,请注意),请指定MySQL的相关位置,主要是MySQL的include和lib目录(Sphinx编译的时候要用到里面的.h头文件),--with-mysql-includes及--with-mysql-libs就是为了指定这两个位置的
view source
print?
显示如下图所示内容时,表示可以接着执行下面的make及make install命令
view source
print?
如果显示bin,etc和var三个目录表示安装成功
3.让Sphinx支持中文分词
view source
print?
如果提示bin/mkdict: error while loading shared libraries: libmysqlclient.so.16等错误(以下命令中的libmysqlclient.so.16.0.0的位置取决于我们mysql编译安装的位置)
view source
print?
再次执行
view source
print?
4.配置Sphinx
view source
print?
输入以下内容
view source
print?
中文在linux下可能会看到乱码,不用管
5.创建测试数据库并添加测试内容(请先连上自己的MySQL数据库)
在MySQL中执行如下命令
view source
print?
好了,万事俱备了,可以开始实战操作Sphinx了
二.实战操作Sphinx
1.建立索引(如果配置文件有改动,应该重新生成索引文件,如果下面第3点中的searchd进程已经开启的话,应先关闭)
#生成goods索引[需要确保要连接的主机的MySQL数据库正常运行,并且3306端口可以访问]
view source
print?
#如果配置文件里有多个索引,需要一次生成使用--all参数
view source
print?
2.在linux命令行下测试搜索
view source
print?
搜索结果如下图示:
3.开启守护进程(供API调用,如果配置文件改动,应重新启动这个进程,不然搜到的数据不是最新)
view source
print?
# 防火墙需要开放9312端口供外部访问9312端口(3306是MySQL的端口)
view source
print?
三.外部API调用(PHP版)
注意使用时前提是执行了以上的步骤3.开启守护进程,而且防火墙也开启了9312端口
1.把/usr/local/src/sphinx-for-chinese-1.10.1-dev-r2287/api/sphinxapi.php弄出来,和下面第2点中的search.php放在同级目录(这个只是示例,放在哪里都可以,包含的时候找到正确的sphinxapi.php的位置即可)
2.编辑search.php文件,内容如下(具体内容请读者自己定,我这里只是示例)
view source
print?
更多详细配置请参看/usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf.dist文件里面有包括实时索引,增量索引等很多内容,英文原版的,很详细
Sphinx中文分词详细安装配置及API调用实战手册[转载]
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用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(sphinx-for-chinese官方下载)及中文分词词典xdict_1.1
view source
print?
1 | $ cd /usr/ local /src |
2 | $wget -c http://sphinx- for -chinese.googlecode.com/files/sphinx- for -chinese-1.10.1-dev-r2287. tar .gz |
3 | $wget -c http://sphinx-[/code]for-chinese.googlecode.com/files/xdict_1.1.tar.gz |
view source
print?
1 | $ cd /usr/ local /src |
2 | $ tar zxvf sphinx- for -chinese-1.10.1-dev-r2287. tar .gz |
3 | $ cd sphinx- for -chinese-1.10.1-dev-r2287 |
4 | #MySQL安装在默认位置的使用如下命令 |
5 | $./configure --prefix=/usr/ local /sphinx- for -chinese-1.10.1 --with-mysql |
#如果MySQL不是安装在默认位置(特别是自己编译MySQL的,请注意),请指定MySQL的相关位置,主要是MySQL的include和lib目录(Sphinx编译的时候要用到里面的.h头文件),--with-mysql-includes及--with-mysql-libs就是为了指定这两个位置的
view source
print?
1 | ./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 |
view source
print?
1 | $ make |
2 | $ make install |
3 | #最后执行命令 |
4 | $ ls /usr/ local /sphinx- for -chinese-1.10.1/ |
3.让Sphinx支持中文分词
view source
print?
1 | $ cd /usr/ local /src |
2 | $ tar zxvf xdict_1.1. tar .gz |
3 | $/usr/ local /sphinx- for -chinese-1.10.1/bin/mkdict xdict_1.1.txt xdict_1.1 |
view source
print?
1 | ln -s /usr/ local /webserver/mysql/lib/mysql/libmysqlclient.so.16.0.0 /usr/lib/libmysqlclient.so.16 |
view source
print?
1 | $/usr/ local /sphinx- for -chinese-1.10.1/bin/mkdict xdict_1.1.txt xdict_1.1 |
2 | #提示Chinese dictionary was successfully created!表示中文分词词典生成成功 |
3 | $ cp xdict_1.1 /usr/ local /sphinx- for -chinese-1.10.1/etc/xdict_1.1 |
view source
print?
1 | vi /usr/ local /sphinx- for -chinese-1.10.1/etc/sphinx.conf |
view source
print?
001 | # sphinx基本配置 |
002 | # 索引源 |
003 | source goods_src |
004 | { |
005 | # 数据库类型 |
006 | type =mysql |
007 | # MySQL主机IP |
008 | sql_host =localhost |
009 | # MySQL用户名 |
010 | sql_user =sphinxuser |
011 | # MySQL密码 |
012 | sql_pass =sphinxpass |
013 | # MySQL数据库 |
014 | sql_db =sphinx |
015 | # MySQL端口(如果防火墙有限制,请开启) |
016 | sql_port=3306 |
017 | # MySQL sock文件设置(默认为/tmp/mysql.sock,如果不一样,请指定) |
018 | sql_sock =/tmp/mysql.sock |
019 | # MySQL检索编码(数据库非utf8的很可能检索不到) |
020 | sql_query_pre =SET NAMES UTF8 |
021 | # 获取数据的SQL语句 |
022 | 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 |
023 | # 以下是用来过滤或条件查询的属性(以下字段显示在查询结果中,不在下面的字段就是搜索时要搜索的字段,如SQL语句中的goods_color_search,goods_name_search) |
024 | # 无符号整型 |
025 | #goods_id为主键,如果加在这里在生成索引的时候会报attribute 'goods_id' not found,这里用goods_id_new来变通 |
026 | sql_attr_uint =goods_id_new |
027 | # 字符串类型 |
028 | sql_attr_string =goods_name |
029 | sql_attr_string =goods_color |
030 | # 用于命令界面端(CLI)调用的测试(一般来说不需要) |
031 | #sql_query_info =SELECT * FROM goods_test Where goods_id =$goods_id; |
032 | } |
033 | # 索引 |
034 | index goods |
035 | { |
036 | # 索引源声明 |
037 | source =goods_src |
038 | # 索引文件的存放位置 |
039 | path =/usr/ local /sphinx- for -chinese-1.10.1/var/data/goods |
040 | # 文件存储模式(默认为extern) |
041 | docinfo =extern |
042 | # 缓存数据内存锁定 |
043 | mlock =0 |
044 | # 马氏形态学(对中文无效) |
045 | morphology =none |
046 | # 索引词最小长度 |
047 | min_word_len =1 |
048 | # 数据编码(设置成utf8才能索引中文) |
049 | charset_type =utf-8 |
050 | # 中文分词词典 |
051 | chinese_dictionary =/usr/ local /sphinx- for -chinese-1.10.1/etc/xdict_1.1 |
052 | # 最小索引前缀长度 |
053 | min_prefix_len =0 |
054 | # 最小索引中缀长度 |
055 | min_infix_len =1 |
056 | # 对于非字母型数据的长度切割(for CJK indexing) |
057 | ngram_len =1 |
058 | # 对否对去除用户输入查询内容的html标签 |
059 | html_strip =0 |
060 | } |
061 | # 索引器设置 |
062 | indexer |
063 | { |
064 | # 内存大小限制 默认是 32M,最大 2047M,推荐为 256M 到 1024M之间 |
065 | mem_limit =256M |
066 | } |
067 | # sphinx服务进程search的相关配置 |
068 | searchd |
069 | { |
070 | # 监测端口及形式,一下几种均可,默认为本机9312端口 |
071 | # listen =127.0.0.1 |
072 | # listen =192.168.0.1:9312 |
073 | # listen =9312 |
074 | # listen =/var/run/searchd.sock |
075 | # search进程的日志路径 |
076 | log =/usr/ local /sphinx- for -chinese-1.10.1/var/log/searchd.log |
077 | # 查询日志地址 |
078 | query_log =/usr/ local /sphinx- for -chinese-1.10.1/var/log/query.log |
079 | # 读取超时时间 |
080 | read_timeout =5 |
081 | # 请求超时市时间 |
082 | client_timeout =300 |
083 | # searche进程的最大运行数 |
084 | max_children =30 |
085 | # 进程ID文件 |
086 | pid_file =/usr/ local /sphinx- for -chinese-1.10.1/var/log/searchd.pid |
087 | # 最大的查询结果返回数 |
088 | max_matches =1000 |
089 | # 是否支持无缝切换(做增量索引时需要) |
090 | seamless_rotate =1 |
091 | # 在启动运行时是否提前加载所有索引文件 |
092 | preopen_indexes =0 |
093 | # 是否释放旧的索引文件 |
094 | unlink_old =1 |
095 | # MVA跟新池大小(默认为1M) |
096 | mva_updates_pool =1M |
097 | # 最大允许的网络包大小(默认8M) |
098 | max_packet_size =8M |
099 | # 每个查询最大允许的过滤器数量(默认256) |
100 | max_filters =256 |
101 | #每个过滤器最大允许的值的个数(默认4096) |
102 | max_filter_values =4096 |
103 | # 每个组的最大查询数(默认为32) |
104 | max_batch_queries =32 |
105 | } |
106 | # Sphinx配置文件结束 |
5.创建测试数据库并添加测试内容(请先连上自己的MySQL数据库)
在MySQL中执行如下命令
view source
print?
01 | mysql> create database sphinx collate 'utf8_general_ci' ; |
02 | mysql> grant all privileges on sphinx.* to 'sphinxuser' @ '' identified by 'sphinxpass' ; |
03 | mysql> grant all privileges on sphinx.* to 'sphinxuser' @ 'localhost' identified by 'sphinxpass' ; |
04 | mysql>use sphinx; |
05 | mysql> CREATE TABLE IF NOT EXISTS `goods_test` ( |
06 | `goods_id` int (10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id' , |
07 | `goods_name` varchar (255) NOT NULL COMMENT '商品名称' , |
08 | `goods_color` varchar (60) NOT NULL COMMENT '商品颜色' , |
09 | PRIMARY KEY (`goods_id`) |
10 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT= '商品表,sphinx示例' AUTO_INCREMENT=11 ; |
11 | mysql> INSERT INTO `goods_test` (`goods_id`,`goods_name`,`goods_color`) VALUES |
12 | (1, '热卖时尚双肩背包' , '黑色' ), |
13 | (2, '热卖时尚电脑双肩背包' , '灰色' ), |
14 | (3, '缤纷炫动时尚化妆包' , '黑色' ), |
15 | (4, '缤纷炫动时尚化妆包' , '蓝色' ), |
16 | (5, '缤纷炫动时尚化妆包' , '粉红' ), |
17 | (6, '极致性感 女款衬衫' , '黑色' ), |
18 | (7, '个性宣言 男款短袖衬衫' , '蓝色' ), |
19 | (8, '个性宣言 男款短袖衬衫' , '红色' ), |
20 | (9, '个性宣言 男款短袖衬衫' , '绿色' ), |
21 | (10, '个性宣言 男款短袖衬衫' , '黑色' ); |
二.实战操作Sphinx
1.建立索引(如果配置文件有改动,应该重新生成索引文件,如果下面第3点中的searchd进程已经开启的话,应先关闭)
#生成goods索引[需要确保要连接的主机的MySQL数据库正常运行,并且3306端口可以访问]
view source
print?
1 | /usr/ local /sphinx- for -chinese-1.10.1/bin/indexer-c /usr/ local /sphinx- for -chinese-1.10.1/etc/sphinx.conf goods |
view source
print?
1 | /usr/ local /sphinx- for -chinese-1.10.1/bin/indexer-c /usr/ local /sphinx- for -chinese-1.10.1/etc/sphinx.conf --all |
view source
print?
1 | /usr/ local /sphinx- for -chinese-1.10.1/bin/search -c /usr/ local /sphinx- for -chinese-1.10.1/etc/sphinx.conf 个性黑色 |
3.开启守护进程(供API调用,如果配置文件改动,应重新启动这个进程,不然搜到的数据不是最新)
view source
print?
1 | /usr/ local /sphinx- for -chinese-1.10.1/bin/searchd-c /usr/ local /sphinx- for -chinese-1.10.1/etc/sphinx.conf & #执行后记得再按回车 |
view source
print?
1 | /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT |
2 | /sbin/iptables -I INPUT -p tcp --dport 9312 -j ACCEPT |
3 | /etc/rc.d/init.d/iptables save |
注意使用时前提是执行了以上的步骤3.开启守护进程,而且防火墙也开启了9312端口
1.把/usr/local/src/sphinx-for-chinese-1.10.1-dev-r2287/api/sphinxapi.php弄出来,和下面第2点中的search.php放在同级目录(这个只是示例,放在哪里都可以,包含的时候找到正确的sphinxapi.php的位置即可)
2.编辑search.php文件,内容如下(具体内容请读者自己定,我这里只是示例)
view source
print?
01 | <?php |
02 | header ( 'Content-Type: text/html;charset="UTF-8"' ); |
03 | if ( $_GET ) { |
04 | // 关键词 |
05 | $keyword =urldecode (trim ( strip_tags ( $_GET [ 'keyword' ] ) ) ); |
06 | if ( $keyword ) { |
07 | // 包含Sphinx的api文件 |
08 | require_once 'sphinxapi.php' ; |
09 | // sphinx服务器地址 |
10 | $server = '192.168.128.130' ; |
11 | // 端口 |
12 | $port =9312; |
13 | // 索引名 为*时表示搜索所有索引 |
14 | $indexName = 'goods' ; |
15 | // 分页页码 |
16 | $page = intval
$_GET [ 'page' ] ) > 1 ? intval ( $_GET [ 'page' ] ) : 1; |
17 | // 每页显示的数量 |
18 | $pageSize =30; |
19 | $sphinx = new SphinxClient (); |
20 | // 建立连接 |
21 | $sphinx ->SetServer ( $server , $port ); |
22 | // 连接超时时间(非常必要,比如sphinx服务器挂了等异常情况) 单位为s,秒 |
23 | $sphinx ->SetConnectTimeout (3 ); |
24 | // 最大查询时间 单位为ms,毫秒 |
25 | $sphinx ->SetMaxQueryTime (2000 ); |
26 | // 按分页取结果 |
27 | $sphinx ->SetLimits (( $page - 1) * $pageSize , $pageSize ); //第一个参数为offset,第二个参数为limit |
28 | // 模式 |
29 | // $sphinx->SetMatchMode(SPH_MATCH_EXTENDED); |
30 | // 取到的原始数据 |
31 | $orgDatas = $sphinx ->Query ( $keyword , $indexName ); |
32 | // 调试用,如果有错误的话,可以打印$errors的值 |
33 | $errors = $sphinx ->GetLastError (); |
34 | var_dump ( $errors ); |
35 | echo '<pre>' ; |
36 | var_dump ( $orgDatas ); |
37 | /* // 下面是对结果的处理 |
38 | $datas =array('goods'=>array(),'total'=>0); |
39 | if ($orgDatas['total'] > 0) { |
40 | $datas['total'] =$orgDatas['total']; |
41 | foreach ($orgDatas['matches'] AS $val) { |
42 | $val['attrs']['goods_id'] =$val['attrs']['goods_id_new']; |
43 | unset($val['attrs']['goods_id_new']); |
44 | $datas['goods'][] =$val['attrs']; |
45 | } |
46 | } |
47 | var_dump($datas); |
48 | */ |
49 | } |
50 | } else { |
51 | echo '<form method="get"><input type="type" name="keyword"><input type="submit" value="商品搜索"></form>' ; |
52 | } |
53 | ?> |
相关文章推荐
- Sphinx中文分词详细安装配置及API调用实战手册
- Sphinx中文分词详细安装配置及API调用实战
- Sphinx中文分词安装配置及API调用
- Sphinx-for-chines中文分词安装配置及API调用
- (转)Sphinx中文分词安装配置及API调用
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- Linux下带有中文分词的sphinx—coreseek安装和配置--2
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例(转)
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
- Sphinx + MySQL + 中文分词安装配置
- FckEditor配置手册中文教程详细说明
- FckEditor中文配置手册详细说明