Sphinx / coreseek 从懵逼到入门一站式不完全指南
本文内容:
主要解决以下问题:
Sphinx / coreseek 是什么,它解决什么问题,什么情况下我应该使用它,如何使用 ?
前置知识:
1、有 Linux 的命令行的基本编译使用经验
2、熟悉 php 的基本语法
3、熟悉 php 开发环境的搭建
Sphinx / coreseek 简介
Sphinx / coreseek 是一款全文搜索引擎。主要解决海量数据的检索问题。
coreseek 是国人在 Sphinx 基本上开发的支持中文分词等强大功能的解决方案 - 可以看做是 Sphinx for chinese ^^
核心组件和工作原理概述
在 coreseek 安装完毕之后 ( 后文会有详细的编译安装过程,这里只做了解即可 ),会有以下的执行文件位于: 安装目录/coreseek/bin 下面:
indexer indextool search searchd spelldump
一、其中 indexer 为建立索引的工具,可以用于建立倒排索引,即图中的步骤 1
二、searchd 为搜索守护进程, 用于和编程语言通讯完成查询操作, 即步骤 2、3
三、step 二之后, 返回的是 MySQL (或者其他数据库,本文的数据源是来自 MySQL )数据表的主键,然后根据主键去数据库查询需要的字段即可。
作业环境:
操作系统: centos 6
软件:PHP 5.6.36 、MySQL 5.5.60、coreseek4.1 beta
安装配置
先下载 coreseek4.1:https://download.csdn.net/download/u010620626/10696385
注意:
后面的操作,如无特殊说明,均是使用 root 身份执行,若在执行命令的过程中遇到报错,参见文末常见错误的解决方法。
# 1、解压并切换到解压后的目录
tar -zxf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta
ll
# 解压后可以看到有以下文件 csft-4.1 mmseg-3.2.14 README.txt testpack
# 2、编译分词软件包 mmseg ( 更多关于 mmseg 信息,见文章底部附录)
cd mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3
make
make install
# 3、安装 coreseek
1) cd ../csft-4.1/
2) sh buildconf.sh
3) ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
# 为了避免后面产生一个 libiconv 类型的错误,这里直接修改,节约一个编译的时间
4) vim src/Makefile
将 249 行从 "LIBS = -ldl -lm -lz -lexpat -L/usr/local/lib -lrt -lpthread" 修改为 "LIBS = -ldl -lm -lz -lexpat -liconv -L/usr/local/lib -lrt -lpthread"
5) make && make install
# 4、这里为止,大部分的安装工作 (后文还有一个 php 连接 sphinx 的客户端编译和 sphinx 索引配置相关的工作) ,我们来针对分词功能进行一些测试
cd ../testpack/
cat var/test/test.xml # test.xml 中有一些用来测试分词的中文
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml # 使用 mmseg 对 test.xml 的语料进行分词
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索
出现如下的结果,说明一切正常
PHP 和 Sphinx 进行通讯有两种可选方式:
1、在 PHP 所在的环境安装 libsphinxclient 依赖 (推荐)
2、inlude 解压目录 coreseek-4.1-beta/testpack/api/sphinxapi.php 文件后使用。
为了配合框架的命名空间和保持代码的风格一致性,( 而且我偷偷臆测可能使用编译类库的性能要好些,没有测试 ), 于是我使用的第一个方式。
# 1、安装 sphinxclient 扩展,切换到 libsphinxclient 目录,根据自己实际环境酌情修改,后文如无特殊说明,所有路径都是根据自己的环境酌情修改
cd coreseek-4.1-beta/testpack/api/libsphinxclient
./configure --prefix=/usr/local/sphinxclient
make && make install
# 2、安装 sphinx PHP 扩展
wget -c http://pecl.php.net/get/sphinx-1.3.3.tgz # 最新的 sphinx 扩展可以在 pecl 官网下载 http://pecl.php.net, 截止发文 1.3.3 的扩展适用于 PHP 5.2.2 - 6.0.0 版本
tar -zxf sphinx-1.3.3.tgz
cd sphinx-1.3.3.tgz
phpize # 如果 phpize 不在环境变量中则需指定完整路径
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinxclient # 注意这里 with-php-config 参数填写自己的实际 php-config 文件路径, with-sphinx 后填写步骤 1 中 sphinxclient 指定的安装路径
make && make install
# 3、在 php.ini 中添加 sphinx 扩展
extension=sphinx.so
# 4、确认扩展安装成功
php -m | grep sphinx # 看到红色的 sphinx 字样说明安装成功
索引配置
接下来,讲解索引配置文件的构成和作用。
行文思路:
1、先看到的结构块,做到对构成成分有大体的把握
2、再针对各个结构快详细进行讲解
vim /usr/local/coreseek/etc/sphinx.conf.dist # 下面我们使用这个文件来讲解 sphinx 配置文件
# 数据源
# 主要作用: 指定要索引数据源及该数据源的其他一些参数,比如数据类型 (Mysql 、xml 等),连接的账户密码等
source src1 # source 关键字配置数据数据源, src1 可以是任意合法的变量名
{
}
# 索引
# 主要作用: 创造索引需要的一些条件,如:指定索引的数据源,分词词库目录和数据编码等
index test1 # index 关键字配置索引, test1 名称可以按需要指定
{
}
# 构建索引的服务
indexer # 索引服务的一些配置,后文我们将在这里限制索引时能使用的最大内存
{
}
# 搜索服务的守护进程
#主要作用:对守护进程进行一些配置,比如守护进程的监听端口日志文件的路径等
searchd # 对应 searchd 守护进程的一些配置
{
}
下面再具体讲解
这是我们用于测试的最小配置
# 数据源
source main
{
# 数据(库)类型
type=mysql
# host
sql_host=127.0.0.1
# 用户
sql_user=root
# 密码
sql_pass=root
# 数据库
sql_db=test
# 端口
sql_port=3306
# 在 sql_query 之前执行
sql_query_pre=set names utf8
sql_query=select id, title from news
# 适用于命令行
sql_query_info=select id, title from news
}
# 索引
index ind_main
{
source=main
path=/usr/local/coreseek/var/data/ind_main/
charset_type=zh_cn.utf-8
charset_dictpath=/usr/local/mmseg/etc
}
# 索引服务
indexer
{
# 设置最大索引时内存限制大小
mem_limit=128M
}
# 搜索守护进程
searchd
{
listen=9312
listen=9306:mysql41
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
log=/usr/local/coreseek/var/log/searchd_mysql.log
query_log=/usr/local/coreseek/var/log/query_mysql.log
}
# 如果需要了解更多的配置项: https://hackoops.com/476.html
PHP + coreseek 的示范
1、建立测试 MySQL 数据
下面是测试要用到的数据表和数据,需要录入 MySQL 中,我们建立并使用 test 的数据库。
create table news (
id int(11) primary key auto_increment,
title varchar(100) not null,
content text)
;
insert into news (title,content) values ('PHP 是最好的语言', '编程语言学习心得'), ('PHP 从入门到架构', 'ppt架构师了解一下');
2、coreseek 配置文件准备
将最小测试配置文件复制到 /usr/local/coreseek/etc/ 目录下命名为 csft.conf 文件 (文件名可以根据需要另行指定,/usr/local/coreseek/etc/csft.conf 是 coreseek 需要配置文件的默认路径和文件名,因此后面在启动 searchd 服务或者索引服务的时候可以省略配置文件路径)
3、建立索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf
测试索引
/usr/local/coreseek/bin/search php
看到如下输出,则索引建立好了。
4、启动 searchd 索引服务
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf # 如果是标准路径则配置文件路径可以省略
启动之后,我们就可以使用 php 来执行查询了
<?php
$s = new SphinxClient;
var_dump($s);
$s->setServer('127.0.0.1', 9312);
$s->setMatchMode( SPH_MATCH_EXTENDED2 );
$s->SetLimits( 0, 20, 1000 );
$result = $s->query( " PHP", 'ind_main' );
// $result2 = $s->query( " @(title, content) PHP", 'ind_main' ); // 指定搜索字段范围: 在 title, content 字段同时搜索 更多参见: http://web.archive.org/web/20150403083256/http://www.coreseek.cn:80/docs/coreseek_4.1-sphinx_2.0.1-beta.html
// $result3 = $s->query("架构师", 'ind_main');
var_dump($result);
// var_dump($result2);
// var_dump($result3);
补充:
上面注释掉的部分并没有得到期待的查询结果,这是 coreseek 的默认词库限制导致的,通常如果对搜索结果的精度有一定得要求,则会选择扩展词库,可以参见我的另一篇文章
更新索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --rotate --all # 当有多个索引的时候可以通过 --all 更新所有,也可以像这样(ind_main)指定更新单独的索引
结束语
最后我们来回顾一下,coreseek 是一款全文检索殷勤,作用是提供海量数据的高速检索和服务搭建配置等基础操作。
常见错误:
1、
error: cannot find input file: src/Makefile.in
或者遇到其他类似error错误时…
解决方案:
依次执行下面的命令,我运行’aclocal’时又出现了错误,解决方案请看下文描述
yum -y install libtool
aclocal
libtoolize --force
automake --add-missing
autoconf
autoheader
make clean
2、
如果出现undefined reference to `libiconv’的类似错误,可以按照如下方法处理:
首先configure,然后vim src/makefile
在其中搜索lexpat,在其后加上 -liconv
修改后该行应该为:-lexpat -liconv -L/usr/local/lib
然后再次make && make install
3、
编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in这个的错误,然后运行下列指令再次编译就能通过了:
aclocal
libtoolize --force
automake --add-missing
autoconf
autoheader
make clean