1.Sphinx简介
1.1.Sphinx是什么
Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS 的原生支持)
1.2.Sphinx的特性
- 高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
- 高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
- 可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可 处理100 M 文档);
- 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
- 支持分布式搜索;
- 支持短语搜索
- 提供文档摘要生成
- 可作为MySQL的存储引擎提供搜索服务;
- 支持布尔、短语、词语相似度等多种检索模式;
- 文档支持多个全文检索字段(最大不超过32个);
- 文档支持多个额外的属性信息(例如:分组信息,时间戳等);
- 支持断词;
接下来开始动手安装:
如果是ubuntu等使用apt-get命令的
apt-get install make gcc g++ automake libtool mysql-client libmysqlclient-dev libxml2-dev libexpat1-dev
git clone https://github.com/dollarphper/soft.git
下载coreseek-4.1-beta.tar.gz,解压,进入coreseek-4.1-beta
安装mmseg分词,这个是中文分词的插件
cd coreseek-4.1-beta/mmseg-3.2.14/
./bootstrap
./configure --prefix=/usr/local/mmseg3 #配置安装位置
make && make install
#编译、安装 mmseg-3.2.14
cd coreseek-4.1-beta/csft-4.1
sh buildconf.sh
./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
make
make install
注意:执行上一步的 sh buildconf.sh 可能会遇到问题,没生成configure,要
csft-4.1/buildconf.sh
查找
&& aclocal
后加上
&& automake --add-missing
csft-4.1/configure.ac
查找
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
改为
AM_INIT_AUTOMAKE([-Wall foreign])
查找
AC_PROG_RANLIB
后面加上
AM_PROG_AR
csft-4.1/src/sphinxexpr.cpp
替换所有
T val = ExprEval ( this->m_pArg, tMatch );
为
T val = this->ExprEval ( this->m_pArg, tMatch );
./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
make && make install
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/artic.conf # 启动服务
sudo /usr/local/coreseek/bin/searchd --stop # 关闭守护进程
sudo /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/artic.conf --all --rotate # 创建索引
sudo /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/artic.conf 芯片 # 搜索:芯片
查看端口:
ss -tnl | grep -e 9306 -e 9312
加入开机启动
打开 /etc/rc.local ,添加启动代码
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/artic.conf
artic.conf使用mysql数据源配置文件内容如下:
source src1
{
type = mysql
sql_host = localhost
sql_user = homestead
sql_pass = secret
sql_db = ichub2
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query = select id,id as aid,post_title,post_keywords,post_excerpt,post_source,post_content,create_time from cmf_portal_post
sql_attr_uint = aid
sql_attr_timestamp = create_time
sql_query_info_pre = SET NAMES utf8
sql_query_info = SELECT * FROM cmf_portal_post WHERE id=$id
}
index test1
{
source = src1
path = /usr/local/coreseek/var/data/artic
docinfo = extern
charset_type = zh_cn.utf-8
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = /usr/local/mmseg/etc/
}
indexer
{
mem_limit = 32M
}
searchd
{
listen = 9312
listen = 9306:mysql41
log = /usr/local/coreseek/var/log/searchd.log
query_log = /usr/local/coreseek/var/log/query.log
read_timeout = 5
max_children = 30
pid_file = /usr/local/coreseek/var/log/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
}
PHP调用sql数据源的代码如下:
require '/home/vagrant/soft/coreseek-4.1-beta/testpack/api/sphinxapi.php';
$keyword = '芯片';
$sphinx = new SphinxClient();
$sphinx->SetServer('localhost',9312);
$sphinx->setMatchMode(SPH_MATCH_ANY);//匹配模式 SPH_MATCH_ALL:完全匹配
$result = $sphinx->query($keyword,'test1');//*表示在所有索引里面进行搜索
$ids = implode(',',array_keys($result['matches']));
$conn = mysqli_connect('localhost','root','123456');
mysqli_query($conn,'set names utf8');
mysqli_select_db($conn,'lchzai');
$sql = "select id,id as aid,post_title,post_keywords,post_excerpt,post_source,post_content,create_time from cmf_portal_post where id in (".$ids.")";
$rst = mysqli_query($conn,$sql);
//给匹配关键字添加样式
$opts = array(
'before_match'=>'<font style="font-weight:bold;color:#f00;">',
'after_match'=>'</font>'
);
echo '<pre>';
//print_r($result);
echo '<pre>';
while($row = mysqli_fetch_assoc($rst)){
$row2 = $sphinx->buildExcerpts($row,'test1',$keyword,$opts);//test1 配置文件中的主数据源索引
print_r($row2);
}
可以看到搜索如下结果