coreseek-4.1-beta.tar.gz 包含了分词包 mmseg-3.2.14 和搜索包 csft-4.1。
tar -zxf coreseek-4.1-beta.tar.gz;
第一步,安装mmseg分词包
cd /usr/local/src/coreseek-4.1-beta/mmseg-3.2.14
./bootstrap ##输出的warning信息可以忽略,如果出现error则需要解决
./configure --prefix=/usr/local/mmseg3
make && make install
如果提示:config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting
config.status: error: cannot find input file: src/Makefile.in
则执行以下命令:
先检测你的autoconf和automake安装没有,有的还要求版本,通过yum安装autoconf automake
- [root@linux mmseg-3.2.14]# yum -y install autoconf automake
- [root@linux mmseg-3.2.14]# aclocal
- aclocal:configure.in:26: warning: macro `AM_PROG_LIBTOOL' not found in library
- [root@linux mmseg-3.2.14]# yum -y install libtool
- [root@linux mmseg-3.2.14]# aclocal
- [root@linux mmseg-3.2.14]# libtoolize --force
- Putting files in AC_CONFIG_AUX_DIR, `config'.
- [root@linux mmseg-3.2.14]# automake --add-missing
- [root@linux mmseg-3.2.14]# autoconf
- [root@linux mmseg-3.2.14]# autoheader
- [root@linux mmseg-3.2.14]# make clean
创建测试文件
touch /usr/local/src/1.txt
echo '今天有人请客吃饭,去不去' > /usr/local/src/1.txt
进行分词测试
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc /usr/local/src/1.txt -d为设置使用etc下面的分词包进行分词
这个将输出:
今天/x 有人/x 请客/x 吃饭/x ,/x 去/x 还是/x 不/x 去/x
如上则说明分词工具安装正确。
第二步,安装csft-4.1 ,这个里面即是sphinx的功能实现
cd /usr/local/src/coreseek-4.1-beta/csft-4.1
现需要执行buildconf.sh文件来生成configure文件
./buildconf.sh
如果sh buildconf.sh最后没有生成configure脚本,且提示automake: warnings are treated as errors,可以将configure.ac中的这行
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
改为
AM_INIT_AUTOMAKE([-Wall foreign])
即删掉-Werror,然后重新运行sh buildconf.sh。
如果configure的时候提示没有安装MySQL的头文件,安装libmysql++-dev包即可。
如没其他错误,生成configure后可执行编译安装:
./configure --prefix=/usr/local/csft4 --with-mmseg --without-unixodbc --with-mmseg-includes=/usr/local/mmseg4/include/mmseg --with-mmseg-libs=/usr/local/mmseg4/lib/ --with-mysql
coreseek 编译时会自动加入 mysql 支持,除非你手动添加 --without-mysql 参数,可以通过 ./configure --help 看到。 而加入 mysql 支持, coreseek 需要知道 mysql.h 和 libmysqlclient.so(Mac 下为 libmysqlclient.dylib) 的位置。
coreseek 获取 mysql.h 和 libmysqlclient.so 的位置的两种方式:
首先需要明确:当 sphinx 知道 mysql_config 的位置时,会从 mysql_config 中获取 includes 和 libs 的路径, 否则需要手工指定 includes 和 libs 的路径。
1、通过参数 --with-mysql:当 mysql_config 在环境变量中时,可以直接使用 --with-mysql 参数,而无需指定任何路径信息, sphinx 会自动从 mysql_config 命令的结果中提取 includes 和 libs 的路径, 当 mysql_config 不在环境变量中时,使用 --with-mysql=/path/to/mysql 指定 mysql_config 的路径, sphinx 会自动在指定路径下的 bin 目录下寻找 mysql_config 文件,所以目录结构应为: /path/to/mysql/bin/mysql_config。
2、通过参数 --with-mysql-includes 和 --with-mysql-libs 直接指定 includes 和 libs 的路径。 如:--with-mysql-includes=/path/to/mysql/include --with-mysql-libs=/path/to/mysql/lib。
注意:是否使用 --with-mysql-includes 和 --with-mysql-libs 参数,只跟 sphinx 是否可以找到 mysql_config 文件有关, 二者选其一即可。
成功会提示 :Thank you for choosing Sphinx!
但是make时报错:
sphinxexpr.cpp:1746:43: 错误:‘ExprEval’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
这是因为gcc版本在4.7以上,编译的时候出现的sphinx的一个bug报错
如下解决:
参看:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=667378
你也可以直接修改csft-4.1/src/sphixexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval。
修改完毕如无其他错误则执行make && make install
最后安装辅助工具
将csft-4.1/contrib/scripts目录下的searchd脚本拷贝到/etc/init.d/目录下,即可使用service命令启动和终止searchd服务并能够配置开机自启动设置。
另外需要注意的是,拷贝到init.d后这个文件还需要一定的配置如:
14 SUDO_USER=searchd --指定用户
15
16 BASE_PATH=/usr/local/csft4 --指定路径
17 PID_FILE=$BASE_PATH/pids/searchd.pid
18 CONFIG_FILE=$BASE_PATH/etc/csft.conf --指定配置
19
20 EXEC_PATH=$BASE_PATH
21 LOG_PATH=$EXEC_PATH/logs --指定日志路径
22
23 RETVAL=0
24 prog="searchd"
使用这个配置文件开启searchd服务时,默认里面配置的用户为searchd用户,所以要么更改要么新建searchd用户和组=====
groupadd -r searchd && useradd -r -g searchd -s /bin/false -M searchd
然后记得将csft的安装目录所有者改为searchd
安装好coreseek后,将/usr/local/coreseek/share/man/目录下的所有文件和目录都拷贝到/usr/local/share/man/目录里,即可使用man命令查看indexer和searchd的使用手册。
安装完毕后可在安装目录看下:
bin/ sphinx的程序目录
searchd 搜索服务器程序
indexer 索引建立工具
etc/
配置文件目录
默认配置文件 example.sql sphinx.conf.dist sphinx-min.conf.dist
share/
man/ sphinx的man手册,建议拷贝到系统man目录,方便查询
var/
data/ 默认的索引存放目录
log/ 默认的日志目录和pid文件目录
如没问题则配置csft.conf,coreseek 默认会找安装目录(/usr/local/csft4)下的 etc/csft.conf 作为配置文件
cd /usr/local/csft4/etc/
cp sphinx-min.conf.dist csft.conf
如果你不想这样使用默认配置csft.conf,可以使用 -c /path/to/filename.conf 指定配置文件,如:
$ ./bin/indexer -c etc/sphinx-min.conf.dist --all ----即使用了未修改为csft.conf的源文件。
现在就可以对配置文件进行自定义的编辑了:
4 #定义数据源
5 source src1
6 {
7 type = mysql
8 sql_host = localhost
9 sql_user = root
10 sql_pass =
11 sql_db = test_sph
12 sql_port = 3306 # optional, default is 3306
13 sql_query_pre = SET NAMES utf8
14 sql_sock =/usr/local/mysql/mysql.sock --特别注意的是如果安装mysql时将mysql.sock通信文件未未使用默认的/var/lib/mysql/mysql.sock,而是自定义了地址,那么这里必须声明。
15
16 sql_query = \
17 SELECT id,title, content \
18 FROM documents
19
20 sql_attr_uint = group_id
21 sql_attr_timestamp = date_added
22
23 sql_query_info = SELECT * FROM documents WHERE id=$id
24 }
26 #定义索引
27 index test1
28 {
29 #索引数据源
30 source = src1
31 #数据地址
32 path = /usr/local/csft4/var/data/test1
33 docinfo = extern
34 charset_type = zh_cn.utf-8
35 #中文分词配置
36 #BSD、Linux环境下设置,/符号结尾
37 charset_dictpath = /usr/local/mmseg4/etc/
38 }
服务端的配置 (均能自定义)
61 searchd
62 {
63 listen = 9312
64 listen = 9306:mysql41
65 log = /usr/local/csft4/var/log/searchd.log --日志文件目录
66 query_log = /usr/local/csft4/var/log/query.log ---查询日志
67 read_timeout = 5
68 max_children = 30
69 pid_file = /usr/local/csft4/var/log/searchd.pid --pid文件目录
70 max_matches = 1000
71 seamless_rotate = 1
72 preopen_indexes = 1
73 unlink_old = 1
74 workers = threads # for RT to work
75 }
然后进入 MySQL 查看 client - connection - server - results 四项的编码,需要保持一致,以下 coreseek 的配置也要保持编码一致:
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)
这里使用的 utf8 编码,如果你使用的 gbk 编码,可能需要额外转换你的 mmseg 分词词库为 gbk 了。
经过以上步骤如果都没错误则可进行生成索引数据进行测试
新建了数据库 text_sph
新建了数据表 documents
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(500) | YES | | NULL | |
| content | varchar(500) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
插入数据:insert into documents values(1,'今天又要下雨了,下班就回家吧','预计当前至20时,房山区将出现分散性雷阵雨天气,有雷电活动,局地短时雨强较大,并伴有短时大风和小冰雹请注 意防');
生成索引:
./usr/local/csft4/bin/indexer --all
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
using config file '/usr/local/csft4/etc/csft.conf'...
indexing index 'test1'...
WARNING: attribute 'group_id' not found - IGNORING
WARNING: attribute 'date_added' not found - IGNORING
WARNING: Attribute count is 0: switching to none docinfo
collected 1 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 1 docs, 198 bytes
total 0.540 sec, 366 bytes/sec, 1.85 docs/sec
skipping non-plain index 'testrt'...
total 2 reads, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg
total 6 writes, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg
查询测试:
./usr/local/csft4/bin/search '下雨'
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
using config file '/usr/local/csft4/etc/csft.conf'...
index 'test1': query '下雨 ': returned 1 matches of 1 total in 0.000 sec
displaying matches:
1. document=1, weight=1500
id=1
title=???????,??????
content=?????20???????????????????????????????????????????????
words:
1. '下雨': 1 documents, 1 hits
index 'testrt': search error: failed to open /usr/local/csft4/var/data/testrt.sph: No such file or directory.
至此,coreseek安装成功并成功测试,下一篇将设置php配合coreseek