云服务器代理商-凯铧互联

php7 + coreseek(sphinx)中文搜索引擎Linux

安裝coreseek

1、下載
官網www.coreseek.cn已不能下載,所以需從網上找資源,
注意的一點是,筆者安裝coreseek-3.2.14版本後,使用時提示client版本高於server版本的錯誤,
php的sphinx擴展,爲使用者,爲client;coreseek是系統服務,爲server

因筆者環境>php7,
而php7版本的sphinx擴展資源有限,無法降低版本。
所以我使用的coreseek最大版本coreseek-4.1-beta

(也可能是我配置的問題,請讀者按以下步驟嘗試安裝coreseek-3.2.14,以下以4.1爲例,如果也出現了這個問題,那麼請安裝4.1版本或者降低sphinx擴展版本)

下載地址:http://files.opstool.com/man/coreseek-4.1-beta.tar.gz
filezilla工具等上傳至/usr下
2,編譯安裝

##安裝必要的編譯工作支持(如已安裝的也建議從新安裝,避免出現錯誤)
yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel

在這裏插入圖片描述

##開始編譯
安裝過程中出現過make出現錯誤的,筆者記不清在何處出現了,執行下make clean即可解決。
$ tar xzvf coreseek-4.1-beta.tar.gz
$ cd coreseek-4.1-beta

csft-3.2.14即coreseek,另外還有mmseg-3.2.14爲mmseg中文分詞,分別安裝之。

##安裝mmseg中文分詞
$ cd mmseg-3.2.14
$ ./bootstrap #輸出的warning信息可以忽略,如果出現error則需要解決
$ ./configure –prefix=/usr/local/mmseg3
$ make && make install
如出現錯誤,大部分是因爲第一步必要的編譯支持沒有安裝。

##安裝csft-4.1
$ cd csft-4.1
$sh buildconf.sh #生成configure文件
(如未生成,且提示automake: warnings are treated as errors,可以將configure.ac中的這行AM_INIT_AUTOMAKE([-Wall -Werror foreign])改爲AM_INIT_AUTOMAKE([-Wall foreign])即刪掉-Werror,然後重新運行sh buildconf.sh。如果configure的時候提示沒有安裝MySQL的頭文件,安裝libmysql+±dev包即可。如沒其他錯誤,生成configure後可執行編譯安裝)
./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 --with-php-config=/www/server/php/72/bin/php-config
(with-mysql:當 mysql_config 在環境變量中時,可以直接使用 –with-mysql 參數,而無需指定任何路徑信息, sphinx 會自動從 mysql_config 命令的結果中提取 includes 和 libs 的路徑, 當 mysql_config 不在環境變量中時,使用 –with-mysql=/path/to/mysql 指定 mysql_config 的路徑, sphinx 會自動在指定路徑下的 bin 目錄下尋找 mysql_config 文件,所以目錄結構應爲: /path/to/mysql/bin/mysql_config。
2、通過參數 –with-mysql-includes 和 –with-mysql-libs 直接指定 includes 和 libs 的路徑。 如:–with-mysql-includes=/path/to/mysql/include –with-mysql-libs=/path/to/mysql/lib。
注意:是否使用 –with-mysql-includes 和 –with-mysql-libs 參數,只跟 sphinx 是否可以找到 mysql_config 文件有關, 二者選其一即可。)

成功會提示 :Thank you for choosing Sphinx!

make && make install
但是make時報錯:

第一种情况:
sphinxexpr.cpp:1746:43: 錯誤:‘ExprEval’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
這是因爲gcc版本在4.7以上,編譯的時候出現的sphinx的一個bug報錯
可以如下解決:修改csft-4.1/src/sphixexpr.cpp文件的1746, 1777和1823行,將三行中的ExprEval改爲this->ExprEval。

第二种情况 如果报错 :
xmlUnknownEncoding
/var/nfs_root/csft-3.1/src/tokenizer_zhcn.cpp:36: undefined reference to `libiconv_close’
/var/nfs_root/csft-3.1/src/tokenizer_zhcn.cpp:38: undefined reference to `libiconv_close’
/var/nfs_root/csft-3.1/src/tokenizer_zhcn.cpp:36: undefined reference to `libiconv_close’
/var/nfs_root/csft-3.1/src/tokenizer_zhcn.cpp:38: undefined reference to `libiconv_close’
/var/nfs_root/csft-3.1/src/tokenizer_zhcn.cpp:36: undefined reference to `libiconv_close’ 类似这样的错误

cd /usr/local/src/coreseek-4.1-beta/csft-4.1/src/Makefile

处理结果:
Add ‘-liconv’ to LIBS in src/Makefile
from
LIBS = -lm -lexpat -L/usr/local/lib
to
LIBS = -lm -lexpat -liconv -L/usr/local/lib

修改完畢如無其他錯誤則執行make && make install

在這裏插入圖片描述

#編譯libsphinxclient 爲即將安裝sphinx擴展做準備
libsphinxclient在csft-4.1/api目錄下

$ cd libsphinxclient/
./configure --prefix=/usr/local/libsphinxclient --with-php-config=/www/server/php/72/bin/php-config

#
–with-php-config=/www/server/php/72/bin/php-config 可能不需要加这个 因为会报没有该指令错误

報如下錯誤;
config.status: creating Makefile
config.status: error: cannot find input file: Makefile.in
這是因爲configure.in的文件格式可能不對(是dos格式),用編輯器打configure.in文件,將其重新保存爲 unix格式。
查看當前格式 :set ff ,如果爲unix則格式正確
不正確的情況:
> vi configure.in
vi > set fileformat=unix
vi > wq
> aclocal
> autoconf
> automake -a
> ./configure
如果格式正確:
aclocal
libtoolize –force
automake –add-missing
autoconf
autoheader
make clean
執行以上命令再次進行安裝
make && make install

報如下錯誤;
config.status: creating Makefile
config.status: error: cannot find input file: Makefile.in
這是因爲configure.in的文件格式可能不對(是dos格式),用編輯器打configure.in文件,將其重新保存爲 unix格式。
查看當前格式 :set ff ,如果爲unix則格式正確
不正確的情況:
> vi configure.in
vi > set fileformat=unix
vi > wq
> aclocal
> autoconf
> automake -a
> ./configure
如果格式正確:
aclocal
libtoolize –force
automake –add-missing
autoconf
autoheader
make clean
執行以上命令再次進行安裝
make && make install

階段總結1

在這裏插入圖片描述

通過安裝mmseg中文分詞、安裝csft-4.1 、編譯libsphinxclient,在/usr/local下

安裝php的sphinx擴展

Coreseek官方教程中建議php使用直接include一個php文件進行操作,但是在laravel中引入php文件來使用,顯然不理想,事實上php有獨立的sphinx模塊可以直接操作coreseek(coreseek就是sphinx!)已經進入了php的官方函數庫,而且效率的提升不是一點點!但php模塊依賴於libsphinxclient包,即剛纔編譯完成的/usr/local/libsphinxclient.

在這裏插入圖片描述

##下載sphinx擴展
php7版本地址:
git.php.net/?p=pecl/search_engine/sphinx.git;a=shortlog;h=refs/heads/php7

如不是php7版本請看下方原文地址.
#編譯sphinx
./configure –with-php-config=/www/server/php/72/bin/php-config –with-sphinx=/usr/local/libsphinxclient
make && make install
安裝完成後,下方會出現sphinx.so的目錄地址,即php擴展的模塊默認目錄
然後找到php.ini
在裏面添加 extension=spninx.so
php-m 或者看下phpinfo();能看到sphinx即可。

配置索引数据源

cd /usr/local/coreseek/etc && vim csft.conf

按照官方手册配置索引数据源,例如一个mysql数据源的示例配置:

#源定义
source mysql
{
    type                = mysql    #表示使用mysql数据源

    sql_host                = localhost    #表示数据库服务器的链接地址
    sql_user                = root          #表示数据库的用户名
    sql_pass                = 123456      #表示数据库的密码
    sql_db              = test          #表示数据库的名称
    sql_port                = 3306         #表示数据库的端口
    sql_query_pre           = SET NAMES utf8

    #从数据库之中读取数据的SQL语句设置
    sql_query               = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
                                        #sql_query第一列id需为整数,且被系统使用,无需再设置sql_attr_uint

    #使用sql_attr设置的字段,只能作为属性,使用SphinxClient::SetFilter()进行过滤;未被设置的字段,自动作为全文检索的字段,使用SphinxClient::Query("搜索字符串")进行全文搜索;
    #title、content作为字符串/文本字段,被全文索引

    sql_attr_uint           = group_id                 #从SQL读取到的值必须为整数;sql_attr_uint表示该字段是数值属性
    sql_attr_timestamp      = date_added      #从SQL读取到的值必须为整数,作为时间属性;sql_attr_timestamp表示该字段是时间属性;可以不用该配置

    sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集,3.2.14开始支持
    sql_query_info          = SELECT * FROM documents WHERE id=$id  #命令行查询时,从数据库读取原始数据信息
}

#index定义
index mysql
{
    source            = mysql             #对应的source名称
    path            = var/data/mysql #索引存放的位置,路径为var/data
    docinfo            = extern
    mlock            = 0
    morphology        = none
    min_word_len        = 1
    html_strip                = 0
    #charset_dictpath = /usr/local/mmseg3/etc/    #BSD、Linux环境下设置,/符号结尾
    charset_dictpath = etc/ #Windows环境下设置,/符号结尾
    charset_type        = zh_cn.utf-8

}

建立索引数据

执行indexer建立索引数据,命令格式为:

indexer -c 配置文件的路径 index名称

例如:

/usr/local/coreseek/bin/indexer -c etc/csft.conf questions

启动检索服务(不启动PHP链接不了)

检索服务需要配置守护进程的相关选项,示例为:

#定义searchd守护进程的相关选项
searchd
{
           #定义监听的IP和端口
   #listen            = 127.0.0.1
   #listen            =172.16.88.100:3312
    listen            = 3312
    listen            = /var/run/searchd.sock
           #定义log的位置
   log                =/usr/local/coreseek/var/log/searchd.log
           #定义查询log的位置
   query_log          =/usr/local/coreseek/var/log/query.log
           #定义网络客户端请求的读超时时间
   read_timeout       = 5
           #定义子进程的最大数量
   max_children       = 300
           #设置searchd进程pid文件名
   pid_file           =/usr/local/coreseek/var/log/searchd.pid
           #定义守护进程在内存中为每个索引所保持并返回给客户端的匹配数目的最大值
   max_matches        = 100000
           #启用无缝seamless轮转,防止searchd轮转在需要预取大量数据的索引时停止响应
    #也就是说在任何时刻查询都可用,或者使用旧索引,或者使用新索引
   seamless_rotate    = 1
           #配置在启动时强制重新打开所有索引文件
   preopen_indexes    = 1
           #设置索引轮转成功以后删除以.old为扩展名的索引拷贝
   unlink_old         = 1
           # MVA更新池大小,这个参数不太明白
   mva_updates_pool   = 1M
           #最大允许的包大小
   max_packet_size    = 32M
           #最大允许的过滤器数
   max_filters        = 256
           #每个过滤器最大允许的值的个数
   max_filter_values  = 4096
}

配置完毕后,执行searchd启动或关闭检索服务,命令格式为:

searchd -c 配置文件的路径
searchd -c 配置文件的路径 –stop

例如:

/usr/local/coreseek/bin/searchd -c etc/csft.conf
/usr/local/coreseek/bin/searchd -c etc/csft.conf --stop

创建索引

/usr/local/coreseek/bin是存放sphinx的命令工具,所有的命令都必须在该目录中操作

[root@localhost ~]# cd /usr/local/coreseek/bin
# 生成所有全文索引文档
[root@localhost ~]# ./indexer --all
# 进行交互时生成增量索引api
[root@localhost ~]# ./indexer --all --rotate
# 全文查找广州关键字
[root@localhost ~]# ./search 广州
# 开启被php连接的9312端口(不开启php无法使用)
[root@localhost ~]# ./searchP

PHP中使用sphinx进行全文索引

<?php
error_reporting(E_ALL & ~E_NOTICE);
header('Content-type:text/html;charset=utf-8');
# 实例化sphinx
$sphinx = new SphinxClient();
# 连接sphinx
$sphinx -> setServer('localhost',9312);
# 选择索引模式
$sphinx -> setMatchMode(SPH_MATCH_ANY);
# 索引关键字和索引名称
$keyword = '中心';
$indexName = 'coreSeekDocsIndex';
# 调用方法开始索引
$rs = $sphinx -> query($keyword,$indexName);
# 获取索引到的数据组件值
$ids = array_keys($rs['matches']);

高亮替换

//使用pdo把数据库中的数据获取回来
$pdo = new PDO("mysql:host=localhost;dbname=php29;charset=utf8","root","123456");
$stmt = $pdo -> prepare( $sql );
$stmt -> execute();
$data = $stmt -> fetchAll( PDO::FETCH_ASSOC );
//定义高亮的样式<span style='color:red'>中心</span>
$opt = array(
	'before_match'=>"<span style='color:red'>",
	'after_match'=>'</span>'
);
//遍历当前的$data
foreach ($data as $res ) {
	//echo "标题:{$res['title']},内容:{$res['content']}<hr />";
	$tmp = $sphinx -> buildExcerpts($res,$indexName,$keyword,$opt);
	echo "标题:{$tmp[4]},内容:{$tmp[5]}<hr />";
}

使用crontab命令定时生成增量索引api

# 打开linux自执行文件 编写自执行脚本
[root@localhost ~] crontab -e

* */1 * * * /usr/local/coreseek/bin/indexer --all --rotate

sphinx中文指南
http://www.sphinxsearch.org/sphinx-tutorial

感謝文章:
借鑑最多的文章:
https://www.cnblogs.com/gaoxu387/archive/2012/12/05/2803183.html
這篇文章講的比較細緻,對錯誤介紹的比較詳細,coreseek4.1
https://blog.csdn.net/youcijibi/article/details/76690286
解決 coreseek 因 gcc 版本大於 4.7導致安裝失敗
https://segmentfault.com/a/1190000005019591
安裝coreseek過程
http://www.thinkphp.cn/topic/34548.html
linux下php支持sphinx的擴展安裝
https://blog.csdn.net/youcijibi/article/details/76728382

擴展文章:
[coreseek/sphinx學習筆記5]–通用API
https://blog.csdn.net/slqgenius/article/details/52108458
coreseek增量索引
https://www.cnblogs.com/timothy-lai/p/6145928.html

赞(0) 打赏
未经允许不得转载:云服务器代理商-凯铧互联 » php7 + coreseek(sphinx)中文搜索引擎Linux

评论 抢沙发

评论前必须登录!

 

凯铧互联专注云计算

联系我们了解更多

觉得文章有用就打赏一下文章作者

微信扫一扫打赏