您的位置:首页 > 其它

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?

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
2.安装sphinx-for-chinese-1.10.1

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的相关位置,主要是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
显示如下图所示内容时,表示可以接着执行下面的make及make install命令



view source

print?

1
$
make
2
$
make

install
3
#最后执行命令
4
$
ls

/usr/
local
/sphinx-
for
-chinese-1.10.1/
如果显示bin,etc和var三个目录表示安装成功

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
如果提示bin/mkdict: error while loading shared libraries: libmysqlclient.so.16等错误(以下命令中的libmysqlclient.so.16.0.0的位置取决于我们mysql编译安装的位置)

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
4.配置Sphinx

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配置文件结束
中文在linux下可能会看到乱码,不用管

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了

二.实战操作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
#如果配置文件里有多个索引,需要一次生成使用--all参数

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
2.在linux命令行下测试搜索

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
&     
#执行后记得再按回车
# 防火墙需要开放9312端口供外部访问9312端口(3306是MySQL的端口)

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
三.外部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?

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
?>
更多详细配置请参看/usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf.dist文件里面有包括实时索引,增量索引等很多内容,英文原版的,很详细
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: