sphinx的安装以及使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lchmyhua88/article/details/88928443

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);
}

可以看到搜索如下结果

猜你喜欢

转载自blog.csdn.net/lchmyhua88/article/details/88928443
今日推荐