手把手搭建sphinx 环境 1
一.概述 1
二.虚拟机的搭建 2
1. 安装 virtualbox 2
2. 准备 suse 的安装环境 2
3. 安装 suse 4
4. 配置共享文件夹 5
5. 设置网络 7
三.Mysql 的安装 8
1. 获取 mysql 源代码 8
2. 获取 sphinx 源码 9
3. 增加 sphinxSE 引擎 9
4. 配置编译 9
5. 启动和测试 9
6. 系统自动启动 mysql 10
四.Sphinx 的搭建 10
1. 解压 coreseek 10
2. 首先安装MMSeg: 10
3. 安装 coreseek 10
4. 配置自动启动 11
五.测试 11
1. 创建数据库 11
2. 创建 sphinx 引擎表格 12
3. 创建 sphinx 配置文件 13
4. 建立索引 19
5. 运行 sphinx 服务器 19
6.查询测试 19
六. 进一步参考 19
Sphinx是一个在 GPLv2 下分发的全文检索引擎; Coreseek 是一个可供企业使用的、基于 Sphinx (可独立于 Sphinx 原始版本运行)的中文全文检索引擎,按照 GPLv2 协议发行。
一般而言,Sphinx 是一个独立的全文搜索引擎;而 Coreseek 是一个支持中文的全文搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的中文全文搜索能力。 Sphinx/Coreseek 可以非常容易的与 SQL 数据库和脚本语言集成。
本文介绍的是基于window XP 下的虚拟机环境搭建 sphinx 测试环境。使用的各软件版本如下,其他版本如有区别,请参考其他文献或代码。
coreseek-4.0.1-beta.tar.gz
VirtualBox-3.2.10-66523-Win.exe
mysql-5.1.56.tar.gz
openSUSE-11.3-DVD-i586.iso
双击,一路选择next 即可。
(1 )新建一个虚拟机
(之前我建立了一个 opensuse 的虚拟机,这次建一个叫做 suse 的虚拟机。 )
(2) 创建一个新的虚拟硬盘
(3) 选择磁盘空间分配方式
(4) 分配磁盘空间大小
磁盘空间大小,建议不要小于15G 空间,建议使用 20G 或者以上。以备后期使用。
(1 )用虚拟光驱加载 openSUSE-11.3-DVD-i586.iso ,
(2 )启动刚才建立的虚拟机
(3)安装 suse
跟正常安装linux 一样安装 suse 。
注意一点就是选择需要安装的软件。建议把开发软件全装上吧。根目录的空间分配要大一些。以备后面开发使用,免得来回折腾安装缺失的软件。下图就是选择需要安装软件的界面截图。
共享文件夹用于在虚拟机suse 上和宿主机 windowXP 之间共享传递文件,两个操作系统都能看见这个共享目录下的文件。
(1 )在 virtualbox 配置共享文件夹
在宿主机window xp 下创建共享目录 D:/share 。
关闭suse ,在 virtualBox 选择 suse, 右键选择设置 -> 数据空间 -> 固定分配, 选择共享目录 D:/share 。
(2) 修改 virtualbox的光驱配置
启动suse ,在菜单 " 设备 " — >" 分配光驱 " 中,选择 VBoxGuestAddiitions.iso 。
(3)在虚拟机上安装 virtualbox 增强工具
重启suse, 在主菜单中选择 computer, 挂载 VBOXADDITIONS_3.0.12_54655 。
cd /media, 可以看到 VBOXADDITIONS_3.0.12_54655 增强软件包的光盘。
用root 运行 VBoxLinuxAdditions-x86.run
重启
(3)在虚拟机上加载共享文件夹
mkdir /mnt/share; mount -t vboxsf share /mnt/share, 这个时候就可以看到共享文件夹了。
suse可以在 /etc/init.d/boot.local 中添加 /bin/mount -t vboxsf share /mnt/share 让它启动时候自动加载。
但在/etc/fstab 中添加没有用,因为系统调用 fstab 的时候, Virtualbox 的共享目录的模块还没有加载,每次加载都会失败。
打开虚拟机suse 的浏览器,设置浏览器的网络链接代理,因为公司必须使用网络代理才能上网,所以必须设置。设置网络浏览器使用脚本 http://txp-01.tencent.com/lvsproxy.pac 。这个时候就可以正常上网了。
直接在虚拟机上上网下载也可以,或者将window xp 中下载的 mysql-5.1.56.tar.gz 拷贝到共享目录中 (D:/share) ,然后在虚拟机上的共享目录 (/mnt/share )目录下,拷贝到你的目录(假如为 /home/software )中。
用tar xvfz mysql-5.1.56.tar.gz 解压。
跟获取mysql 类似。解压在 /home/software 目录下。之所以在这里预先获取 sphinx 的源码,是因为想给 mysql 预先建立 sphinxSE 的引擎。
Tar xvfz coreseek-4.0.1-beta.tar.gz
将coreseek-xxx/csft-xxx/mysqlse 目录下的文件拷贝到 mysql/storage/sphinx 目录下。
cp -r /home/software/coreseek-4.0.1-beta/csft-4.0.1/mysqlse /home/software/mysql-5.1.56/storage/sphinx
依次执行下面命令
sh BUILD/autorun.sh
Mkdir -p /home/sphinx/var/data
mkdir -p /var/log/mysql
mkdir -p /var/lib/mysql
mkdir -p /var/run/mysql
./configure --with-plugins=all --prefix=/usr/local/mysql5.1.56/ --with-charset= gbk --localstatedir=/ home/sphinx/var/data
Make
Make install
(1)关于上面几个目录的说明:
/var/下面的几个目录,是因为 /etc/my.cfg 里面设置的几个目录。你可以根据自己需要去修改 my.cfg 的路径,或者干脆就自己建立这几个目录让 mysql 使用,而不去修改 my.cfg 文件。
(2)关于 configure 的配置选项的说明:
--localstatdir是用来避免权限问题,其他选项 分别支持innodb 和 sphinx 驱动,同时跟 os 自带的 mysql 分开,支持 gbk 编码。自己可以根据需要适当修改。
/usr/local/mysql5.1.56/bin/mysqld_safe &
连接命令:
Mysql
show engines; 检查是否有 sphinx 引擎。
如果启动mysql 有问题,可以用下面命令手动启动,检查对应的错误日志,根据错误日志定位问题。有一个常见的问题,是之前系统安装的时候自动安装了 mysql ,新安装的 mysql 两者有冲突,导致某些表不在配置文件的路径下,报找不到数据表的错误。如果这个错误,可以在用 /usr/local/mysql-5.1.56/bin/mysql_install_db 命令重建缺省的数据库。
/usr/local/mysql5.1.56/libexec/mysqld --basedir=/usr/local/mysql5.1.56 --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysql/mysqld.log --pid-file=/var/lib/mysql/linux-6ky2.pid --socket=/var/run/mysql/mysql.sock --port=3306
其他可能错误请自行google.
在/etc/rc.d/boot.local 中加入 mysql 的启动。加入下面一行。
/usr/local/mysql5.1.56/libexec/mysqld --basedir=/usr/local/mysql5.1.56 --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysql/mysqld.log --pid-file=/var/lib/mysql/linux-6ky2.pid --socket=/var/run/mysql/mysql.sock --port=3306 &
注意如果boot.local 启动错误,有可能导致系统启动不起来。这点很恶心。如果发生这种错误,就用安装盘,从安装盘进入 rescue 模式,然后用 fdisk -l 查看你的硬盘的分区号,这里假定是 /dev/sda2. 用命令 mount /dev/sda2 /mnt/ 挂载,然后 vi /mnt/etc/rc.d/boot.local 进行修改。
如果在安装 mysql已经解压了,直接进入解压以后的目录即可。
$ tar xzvf coreseek-3.2.14.tar.gz
$ cd coreseek
在 mmseg的目录下 依次运行下面命令
libtoolize --force
aclocal
automake --add-missing
autoconf
autoheader
make clean
./configure
Make
Make install
$ ./configure
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
安装二进制程序到你设定的目录下: ( 类 Unix 操作系统下默认为 /usr/local/bin/ , 但是可以被 configure --prefix) 修改安装目录
$ make install
在/etc/rc.d/boot.local 中加入 searchd 的开机启动。
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/csft_mysql.conf
Mysql登陆数据库以后,创建 db 和 schema 。
假如db 是 dbname , schema 如下:
CREATE TABLE t_sns_share_info_0000
(
ID BIGINT UNSIGNED NOT NULL,
FShareId BIGINT UNSIGNED NOT NULL DEFAULT 0,
FUin INTEGER UNSIGNED NOT NULL DEFAULT 0,
FPostTime INTEGER UNSIGNED DEFAULT 0,
FSource INTEGER,
FPostType INTEGER NOT NULL,
FContent VARCHAR(512) NOT NULL DEFAULT '',
FComment VARCHAR(512) DEFAULT '',
FShareType INTEGER NOT NULL,
FOperate INTEGER DEFAULT 0,
FShopId INTEGER DEFAULT 0,
FShopName VARCHAR(255) DEFAULT '',
PRIMARY KEY sid (ID),
UNIQUE KEY shareid(FShareId)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;;
插入两条测试数据:
insert into t_sns_share_info_0000 values(xxxxxx);
insert into t_sns_share_info_0000 values(xxxxxxx);
CREATE TABLE t_shareinfo_sphinxSE
(
id bigint unsigned UNSIGNED NOT NULL,
weight INTEGER default 1,
query VARCHAR(3072) NOT NULL,
FUin INTEGER UNSIGNED default 0,
FPostTime INTEGER UNSIGNED default 0,
FShareType INTEGER default 0,
FShopId INTEGER DEFAULT 0,
INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312";
缺省的配置文件路径在/usr/local/coreseek/etc 目录下。在下面建立(如果没有)或者修改(如果已经存在)文件 /usr/local/coreseek/etc/csft_mysql.conf 。内容如下:
source t_sns_share_info_0000
{
type = mysql
sql_host = 10.xx.xx.xx
sql_user = dbuser
sql_pass = dbpasswd
sql_db = dbname
sql_port = 3306
sql_sock = /xxx/mysql.sock
sql_query_pre = SET NAMES utf8
sql_query = SELECT ID, FShareId, FUin, FPostTime, FSource,FPostType,FContent,FComment,FShareType,FOperate,FShopId,FshopName FROM t_sns_share_info_0000
sql_attr_uint = FUin
sql_attr_uint = FShareId
sql_attr_uint = FPostTime
sql_attr_uint = FSource
sql_attr_uint = FPostType
sql_attr_uint = FShareType
sql_attr_uint = FShopId
}
index t_sns_share_info_0
{
source = t_sns_share_info_0000
path = /usr/local/coreseek/var/data/t_sns_share_info_0_0
docinfo = extern
mlock = 0
morphology = none
exceptions = /usr/local/coreseek/var/exceptions.txt
min_word_len = 1
charset_type = zh_cn.utf-8
charset_dictpath = /usr/local/coreseek/dict
ngram_len = 0
ngram_chars = U+3000..U+2FA1F
html_strip = 0
}
#############################################################################
## indexer settings
#############################################################################
indexer
{
# memory limit, in bytes, kiloytes (16384K) or megabytes (256M)
# optional, default is 32M, max is 2047M, recommended is 256M to 1024M
mem_limit = 40M
# maximum IO calls per second (for I/O throttling)
# optional, default is 0 (unlimited)
#
# max_iops = 40
# maximum IO call size, bytes (for I/O throttling)
# optional, default is 0 (unlimited)
#
# max_iosize = 1048576
# maximum xmlpipe2 field length, bytes
# optional, default is 2M
#
# max_xmlpipe2_field = 4M
# write buffer size, bytes
# several (currently up to 4) buffers will be allocated
# write buffers are allocated in addition to mem_limit
# optional, default is 1M
#
write_buffer = 1M
}
#############################################################################
## searchd settings
#############################################################################
searchd
{
# hostname, port, or hostname:port, or /unix/socket/path to listen on
# multi-value, multiple listen points are allowed
# optional, default is 0.0.0.0:9312 (listen on all interfaces, port 9312)
#
# listen = 127.0.0.1
# listen = 192.168.0.1:9312
listen = 9312
# listen = /var/run/searchd.sock
# log file, searchd run info is logged here
# optional, default is 'searchd.log'
log = /usr/local/coreseek/var/log/searchd_t_sns_share_info_0.log
# query log file, all search queries are logged here
# optional, default is empty (do not log queries)
query_log = /usr/local/coreseek/var/log/query_t_sns_share_info_0.log
# client read timeout, seconds
# optional, default is 5
read_timeout = 5
# request timeout, seconds
# optional, default is 5 minutes
client_timeout = 300
# maximum amount of children to fork (concurrent searches to run)
# optional, default is 0 (unlimited)
max_children = 30
# PID file, searchd process ID file name
# mandatory
pid_file = /usr/local/coreseek/var/log/searchd_9312.pid
# max amount of matches the daemon ever keeps in RAM, per-index
# WARNING, THERE'S ALSO PER-QUERY LIMIT, SEE SetLimits() API CALL
# default is 1000 (just like Google)
max_matches = 1000000
# seamless rotate, prevents rotate stalls if precaching huge datasets
# optional, default is 1
seamless_rotate = 1
# whether to forcibly preopen all indexes on startup
# optional, default is 0 (do not preopen)
preopen_indexes = 0
# whether to unlink .old index copies on succesful rotation.
# optional, default is 1 (do unlink)
unlink_old = 1
# attribute updates periodic flush timeout, seconds
# updates will be automatically dumped to disk this frequently
# optional, default is 0 (disable periodic flush)
#
# attr_flush_period = 900
# instance-wide ondisk_dict defaults (per-index value take precedence)
# optional, default is 0 (precache all dictionaries in RAM)
#
# ondisk_dict_default = 1
# MVA updates pool size
# shared between all instances of searchd, disables attr flushes!
# optional, default size is 1M
mva_updates_pool = 1M
# max allowed network packet size
# limits both query packets from clients, and responses from agents
# optional, default size is 8M
max_packet_size = 8M
# crash log path
# searchd will (try to) log crashed query to 'crash_log_path.PID' file
# optional, default is empty (do not create crash logs)
#
# crash_log_path = /usr/local/coreseek/var/log/crash
# max allowed per-query filter count
# optional, default is 256
max_filters = 256
# max allowed per-filter values count
# optional, default is 4096
max_filter_values = 4096
# socket listen queue length
# optional, default is 5
#
# listen_backlog = 5
# per-keyword read buffer size
# optional, default is 256K
#
# read_buffer = 256K
# unhinted read size (currently used when reading hits)
# optional, default is 32K
#
# read_unhinted = 32K
}
# --eof--
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all
这个命令会根据配置文件/usr/local/coreseek/etc/csft_mysql.conf 生成对应的索引文件。
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
启动服务。
可以通过sphinxSE 进行查询测试。
在mysql 中运行命令 Select * from t_shareinfo_sphinxSE where query="product"; 即可查看查询的结果。更多 sphinxSE 支持的语句请参考手册。
当你走到这一步的时候,恭喜你,完成了sphinx 环境的搭建。
更多的知识,请参考coreseek 和 sphinx 的手册。
http://www.coreseek.cn/docs/coreseek_3.2-sphinx_0.9.9.html
http://www.coreseek.cn/docs/sphinx-1.11-beta.html
多操作,多实践是掌握sphinx 的最快方法。