Centos7下安装Coreseek中文分词
由于工作需求,需在站点中添加一个检索的功能,检索的条件有三个且权重为标题 > 标签 > 内容。在技术选型的过程中考虑了Lucenne、Sphinx、XunSearch三种索搜引擎,加上业务的需求,数据量大致在一万左右,而且是用PHP开发,所以最终选择了XunSearch,XunSearch对中文的支持也是非常棒的,也提供了全面的API文档,开发起来非常快。Lucenne、Sphinx对大数据量支持的比较好,性能很高。Lucenne需要java环境的支持而我这里是PHP的环境,所以排除了。再来看看我们的Sphinx:Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)
高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)
支持分布式检索
支持基于短语和基于统计的复合结果排序机制
支持任意数量的文件字段(数值属性或全文检索属性)
支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)
支持作为Mysql的存储引擎
等等。。。
在网上找了很多安装教程,安装的狠蛋疼,最终在博客上找到了一个比较好的,原文点这里,我在它上面改了一点东西,扩展性变得也比较好,关于Coreseek的说明网上一大推,这里就不再说了,个人理解Coreseek = Sphinx + 中文分词。废话不多说,进入正题
1、先安装环境:
yum install make gcc gcc++gcc-c++libtool autoconf automake imake mysql-devellibxml2-develexpat-devel
注: 检测以上软件是否安装,如果没有请确保安装;否则无法正常安装Coreseek-3.2.14
2、开始安装:
在coreseek的官网下载coreseek-3.2.14.tar.gz,传到自己的服务器/usr/local/下,反正我在使用命令wgethttp://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz没有下载成功,
注意:原文mmseg是安装在/usr/local/mmseg3下,我是安装在/usr/local/mmseg,所以导致我在后面创建索引的时候报错,如图
//upload-images.jianshu.io/upload_images/2788029-605fc85df7a9c2e5.png
后来摸索着在路径/usr/local/coreseek-3.2.14/testpack/etc在这个路径下,将代码
charset_dictpath = /usr/local/mmseg3/etc/改成charset_dictpath = /usr/local/mmseg/etc/就可以。。。
进入/usr/local/下
tar -zxvf coreseek-3.2.14.tar.gz
cd coreseek-3.2.14
##############安装 mmseg #################
cd mmseg-3.2.14
./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决,一般不会出现错误
./configure --prefix=/usr/local/mmseg #指定 mmseg 的安装目录
make && make install
#############安装 csft-3.2.14 ###############
cd /usr/local/coreseek-3.2.14/csft-3.2.14
#这里我们要修改 src/sphinxexpr.cpp 文件,将该文件中的 1013、1047、1080 行的 ExprEval 改为 this->ExprEval(这里的行数跟网上的教程说的行数不一样,可能是版本的问题吧,但是如果你用的是我提供的版本,该行数是正确的),懂点 C++ 的同学也可以自己看看 ExprEval 错在哪里。哈哈我不懂C++都看懂了。。。
#改完上面所说的问题后:
sh buildconf.sh
./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
在安装的过程中,只要不提示错误 error,那么其他的如 warning 信息都是可以忽略的。
至此我们已经成功的将中文检索引擎安装到我们服务器上来了。
3、测试
进入目录/usr/local/coreseek-3.2.14/testpack
cat var/test/test.xml#此时应该正确显示中文
//upload-images.jianshu.io/upload_images/2788029-c1f62d223f224722.png
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml#整篇文章进行分词
//upload-images.jianshu.io/upload_images/2788029-f503458cd6542806.png
/usr/local/coreseek/bin/indexer -c etc/csft.conf--all#创建索引
//upload-images.jianshu.io/upload_images/2788029-edf0c62a7fcde58e.png
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索#搜索关键字 网络搜索
//upload-images.jianshu.io/upload_images/2788029-d9c9477356c27423.png
/usr/local/coreseek/bin/searchd -c etc/csft.conf #正常开启搜索服务
/usr/local/coreseek/bin/searchd -c etc/csft.conf--stop #如要停止搜索服务
/usr/local/coreseek/bin/indexer -c etc/csft.conf--all --rotate #如要已启动服务,要更新索引
到此安装和测试都完成了。。。具体的在后面慢慢研究
作者:Uzero
链接:https://www.jianshu.com/p/240c00982e08
来源:简书
这里我主要讲重点,第一个是基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置
#
# LinuxTone full index search configure file
#
source lt_posts
{
type = mysql
sql_host = 127.0.0.1
sql_user = root
sql_pass =
sql_db = lt_bbs
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1 #此处是基于posts表来做索引的,这样的目的是可以同时检索到subject,message,author 三个字段的值
sql_attr_uint = fid
sql_attr_timestamp = dateline
sql_query_info = SELECT * FROM cdb_posts WHERE pid=$id
}
index lt_posts
{
source = lt_posts
path = /data/sphinx/data/lt_posts
docinfo = extern
mlock = 0
morphology = none
min_word_len = 2
html_strip = 1
charset_dictpath = /usr/local/mmseg-3.2.13/etc/
charset_type = zh_cn.utf-8
ngram_len = 0
}
########## 增量索引 ##################
source delta
{
type = mysql
sql_host = 127.0.0.1
sql_user = root
sql_pass =
sql_db = lt_bbs
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1 and dateline > unix_timestamp()-3600*10 #增量索引采用当前时间戳减去一个需要间隔的时间来新建新增的数据索引
sql_attr_uint = fid
sql_attr_timestamp = dateline
sql_query_info = SELECT * FROM cdb_posts WHERE pid=$id
}
index delta
{
source = delta
path = /data/sphinx/data/lt_delta
docinfo = extern
mlock = 0
morphology = none
min_word_len = 2
html_strip = 1
charset_dictpath = /usr/local/mmseg-3.2.13/etc/
charset_type = zh_cn.utf-8
ngram_len = 0
}
indexer
{
mem_limit = 32M
}
searchd
{
port = 9312
log = /data/sphinx/var/log/searchd.log
query_log = /data/sphinx/var/log/query.log
read_timeout = 5
max_children = 30
pid_file = /data/sphinx/var/log/searchd.pid
max_matches = 10000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
}
sphinx最主要的就是这个配置文件,当然在增量索引部分可以写一个脚本放到crontab里面来定时跑
下面介绍下sphinx的PHP调用部分,sphinx的接口采用PHP的扩展,可以通过pecl或者http://pecl.php.net/package/sphinx来安装
<?php
/**
* LinuxTone全文搜索服务
*/
define('IN_DISCUZ', TRUE);
require_once './include/common.inc.php';
$q = isset($_GET['q']) && !empty($_GET['q']) ? $_GET['q'] : '';
$q = str_replace(array('<','>',' ','\'',','),array('','',' ','',''),strip_tags($q));
$page = isset($_GET['page']) && intval($_GET['page'])>0 ? intval($_GET['page']) : 1;
$perNum = 20;
$offset = ($page - 1) * $perNum;
$search = new SphinxClient();
$search->setServer('127.0.0.1',9312);
$search->setConnectTimeout(2);
$search->setArrayResult(true);
$search->setMatchMode(SPH_MATCH_ANY);
$search->setRankingMode(SPH_RANK_PROXIMITY_BM25);
$search->setSortMode(SPH_SORT_EXTENDED,'@relevance desc,@weight desc');
$search->setLimits($offset,$perNum);
$search->setFieldWeights(array('subject'=>2000,'message'=>0));
$rs = array();
$query_totals = $query_time = 0;
if(!empty($q)){
$rs = $search->Query($q,"*");
$pages = ceil($rs['total']/$perNum);
$query_totals = $rs['total_found'];
$query_time = $rs['time'];
}
$data = $title = $content = array();
if(!empty($rs) && $page <= $pages){
$pids = array();
foreach($rs['matches'] as $v){
$pids[] = $v['id'];
}
$pid = implode(',',$pids);
$sql = "select pid,tid,author,authorid,subject,message,dateline from cdb_posts where pid IN($pid) and status ='0' and invisible='0'";
$query = $db->query($sql);
while($row = $db->fetch_array($query)){
$data[] = $row;
$title[] = $row['subject'];
$content[] = preg_replace('/\[[\/]?(b|img|url|color|s|hr|p|list|i|align|email|u|font|code|hide|table|tr|td|th|attach|list|indent|float).*\]/','',strip_tags($row['message']));
}
//搜索词高亮
$opts = array();
$opts['before_match'] = '';
$opts['after_match'] = '';
$title = $search->BuildExcerpts($title,'lt_posts',$q,$opts);
$content = $search->BuildExcerpts($content,'lt_posts',$q,$opts);
foreach($data as $k=>$v){
$data[$k]['subject'] = $title[$k];
$data[$k]['message'] = $content[$k];
}
$url = "s.php?q=".urlencode($q);
$multipage = multi($rs['total'], $perNum, $page, $url);
}
include template("lt_search");
?>
跑主索引的shell脚本search-index.sh
#!/bin/bash
#
# The BBS search exec full index
#
/usr/local/csft-3.2.13/bin/indexer -c /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate lt_posts >> /data/sphinx/var/`date "+%Y-%m-%d-%H"`.log
跑增量索引的shell脚本search-delta.sh
#!/bin/bash
#
# The BBS search exec delta index
#
#跑增量索引
/usr/local/csft-3.2.13/bin/indexer -c /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate delta
#合并主索引和增量索引
#/usr/local/csft-3.2.13/bin/indexer --config /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate --merge lt_posts delta
页:
[1]