安装前首先安装依赖的软件包
yum
install
make
gcc g++ gcc-c++ libtool autoconf automake imake libxml2-devel expat-devel
在Linux、BSD上安装Sphinx/Coreseek
$ wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
将你下载的tar包解压,并进入coreseek 子目录:
$ tar xzvf coreseek-3.2.14.tar.gz
$ cd coreseek
1、首先安装MMSeg:
$ cd mmseg
$ ./bootstrap
$ ./configure --prefix=/usr/local/mmseg
$ make
$ make install
遇到的问题:
error: cannot find input file: src/Makefile.in
或者遇到其他类似error错误时...
解决方案:
依次执行下面的命令,我运行'aclocal'时又出现了错误,解决方案请看下文描述
$ yum -y install libtool
$ aclocal
$ libtoolize --force
$ automake --add-missing
$ autoconf
$ autoheader
$ make clean
$ ./configure --prefix=/usr/local/mmseg
$ make
$ make install
$ cd ../
2、运行配置 程序:
$ cd csft-4.1
$ yum install mysql-devel libxml2-devel expat expat-devel 支持MySQL数据源
$ /sh buildconf.sh
$ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql-includes=/alidata/server/mysql-5.6.21/include --with-mysql-libs=/alidata/server/mysql-5.6.21/lib
configure程序有很多运行选项。完整的列表可以通过使用 --help 开关得到。最重要的如下:
--prefix, 定义将Coreseek安装到何处;比如 --prefix=/usr/local/coreseek (以下全部示例都假定Coreseek安装在这个位置)
--with-mysql, 当自动检测失败时,指出在那里能找到MySQL 头文件和库文件;
--with-pgsql, 指出在那里能找到PostgreSQL头文件和库文件.
--with-mmseg, 启用基于MMSeg的中文分词法,并指出在那里能找到MMSeg头文件和库文件.
--with-python, 启用Python数据源支持. 需要预先安装Python2.6.
编译源代码生成二进制程序:
$ make
出现undefined reference to `libiconv'的类似错误,可以按照如下方法处理:
##方法一:(Linux使用)
## 直接执行:export LIBS="-liconv"
##然后make clean,再次configure后,进行编译安装make && make install
## 方法二:
## 首先configure,然后vim src/makefile
## 在其中搜索lexpat,在其后加上 -liconv
## 修改后该行应该为:-lexpat -liconv -L/usr/local/lib
## 然后再次make && make install
安装二进制程序到你设定的目录下: (类Unix操作系统下默认为 /usr/local/bin/ , 但是可以被 configure --prefix) 修改安装目录
$ make install
$ cd ../
##中文分词测试,如果显示不正常,请检查当前环境下的locale和UTF-8中文字符显示设置
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc src/t1.txt
中文/x 分/x 词/x 测试/x
中国人/x 上海市/x
若发现错误
error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
解决方式
cd /etc
ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2
ldconfig
##以下为正常情况下的提示信息:
Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
Copyright (c) 2007-2010,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
出现/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory的类似错误,可以按照如下方法处理:
##方法一:
## vi /etc/ld.so.conf
## 将下面这句加到文件到尾部,并保存文件 /alidata/server/mysql-5.6.21/lib
## ldconfig
## 方法二:
## locate libmysqlclient #运行该命令找到关于libmysqlclient.so.18的文件
## ln -s /alidata/server/mysql-5.6.21/lib/libmysqlclient.so.18 /usr/bin/libmysqlclient.so.18
下面开始sphinx与mysql的配置
创建配置sphinx与mysql的配置文件
# vi /usr/local/coreseek/etc/csft_mysql.conf
数据表字段取值对应到Coreseek的索引中,其关系如下: 数据库: SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, score, title, content FROM documents id : 自增字段,表的主键,整数 group_id : 整数字段 date_added : 整数字段,使用UNIX_TIMESTAMP可将datetime类型转换为整数的timestamp score : 浮点数字段 title : 字符串字段 content : 文本字段 业务分析: 文档编号:id 查询过滤:分组(group_id),时间(date_added),score 全文检索:title、content Coreseek索引配置: id :ID属性,必须提供,在SQL语句中字段名称不限 对应SQL查询的第一个字段,系统自动使用,内部属性名为@id,不需要也不能在配置中设定 使用SetFilter()过滤,或者使用SetIDRange()过滤; SphinxSE之中,使用filter或者minid, maxid过滤 sql_attr_uint :整数属性,以上group_id、date_added都可用此设置,使用SetFilter()过滤, 或者使用SetFilterRange()过滤; SphinxSE之中,使用filter或者range过滤; sql_attr_float :浮点数属性,以上score可用此设置,使用SetFilterFloatRange()进行范围过滤, SphinxSE之中,使用range过滤; sql_attr_timestamp:timestamp属性,整数,以上date_added可用此设置,可用SetFilter()过滤 或者使用SetFilterRange()过滤; SphinxSE之中,使用filter或者range过滤 sql_attr_str2ordinal:字符串序列属性,以上title可用此设置,仅用于根据该字段排序 但是设置后,该属性不可用于过滤,也不会保存实际字符串内容,更不能全文检索 搜索结果中,其对应的信息为整数,由系统计算出来的排序序列值 全文检索字段 :全文检索字段,以上title、content等字符串或者文本的字段都可用此设置 任何出现在SQL语句中,既不是ID属性,也没有使用“sql_attr_类型”设置的字段,都是全文字段, 使用Query()搜索; SphinxSE之中,使用query的查询文本进行搜索 其他更详细和丰富的类型,请前往中文手册了解。
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/ #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库 #源定义 source main { type = mysql sql_host = localhost sql_user = didiphp sql_pass = DotDeeMy365com sql_db = new_didi sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = SELECT id, brand_id, seller_id, UNIX_TIMESTAMP(create_time) AS create_time, name, sell_price, market_price, cost_price, store_nums, img, ad_img, content, keywords, description, search_words, visit, favorite, comments, sale, detail, postage, postage_add FROM mall_goods #sql_query第一列id需为整数 #name、content作为字符串/文本字段,被全文索引 sql_attr_uint = brand_id #从SQL读取到的值必须为整数 sql_attr_timestamp = create_time #从SQL读取到的值必须为整数,作为时间属性 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 sql_query_info = SELECT id, brand_id, seller_id, UNIX_TIMESTAMP(create_time) AS create_time, name, sell_price, market_price, cost_price, store_nums, img, ad_img, content, keywords, description, search_words, visit, favorite, comments, sale, detail, postage, postage_add FROM mall_goods WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } #index定义 index main { source = main #对应的source名称 path = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg/etc/ #BSD、Linux环境下设置,/符号结尾 #charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_type = zh_cn.utf-8 } #全局index定义 indexer { mem_limit = 128M } #searchd服务定义 searchd { listen = 9312 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = /usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = /usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... binlog_path = #关闭binlog日志 }
调用命令列表:
启动后台服务(必须开启)
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
如果报错
WARNING: index 'mysql': preload: failed to open var/data/mysql.sph: No such file or directory; NOT SERVING
FATAL: no valid indexes to serve
解决
新建立索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all
更改
mysql的问题 stock路径问题,需要在my.cnf更改 /var/lib/mysql/mysql.sock
vim /etc/my.cnf
#socket = /tmp/mysql.sock
socket = /var/lib/mysql/mysql.sock
防火墙问题 关闭防火墙
启动
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
保证跨机器访问,关闭防火墙
service iptables stop
执行索引(查询、测试前必须执行一次)
# /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
执行增量索引
# /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate
合并索引
# /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0
(为了防止多个关键字指向同一个文档加上--merge-dst-range deleted 0 0)
后台服务测试
# /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf aaa
关闭后台服务
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop
自动化命令:
crontab -e
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate
*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0
30 1 * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
以下任务计划的意思是:每隔一分钟执行一遍增量索引,每五分钟执行一遍合并索引,每天1:30执行整体索引