安装部署
1.Lamp环境准备
2.下载支持中文的Sphinx ---> coreseek
3.安装环境
m4,gcc,gcc-c++,automake,libtool
4.安装中文分词组件mmseg
##安装mmseg
$ cd mmseg-3.2.14
$ ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
5.安装coreseek前准备
依赖mysql及依赖库
mysql-server
mysql-devel
6.安装coreseek
$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1
$ sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决
$ ./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 ins tall
配置
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
source post
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306 # optional, default is 3306
#设置字符集
sql_query_pre = set names utf8
#设置数据来源
sql_query= select id,title,content from post
#sql_attr_uint = group_id
#sql_attr_timestamp = date_added
#提取具体数据
sql_query_info_pre = set names utf8
sql_query_info = SELECT * FROM post WHERE id=$id
}
#配置索引
index ind_post
{
source = post
path = /usr/local/coreseek/var/data/post
docinfo = extern
#去除html标签
html_strip = 1
#完整的去除指定标签
html_remove_elements = style,script
#去除标签的时候,留下点东西
html_index_attrs = img=title,alt; a=title,alt
#设置索引字符集
charset_type = zh_cn.utf-8
#设置词典
charset_dictpath = /usr/local/mmseg3/etc/
}
indexer
{
mem_limit = 32M
}
searchd
{
port = 9312
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 = 0
unlink_old = 1
}
使用
1.基本搜索
开启服务接口
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
2.处理高亮
$opts = array(
"before_match" => "",
"after_match" => ""
);
foreach($list as $key=>$val){
$list[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);
}
注意:处理后会变为索引数组
3.设置匹配模式
$sp->setMatchMode(SPH_MATCH_ANY);
4.设置排序模式
1.按照默认权重排序
$sp->setSortMode(SPH_SORT_EXTENDED,"@weight desc");
2.人工干预排序
1.配置文件设置属性字段
sql_attr_uint = weight
2.重建索引
3.排序
$sp->setSortMode(SPH_SORT_EXTENDED,"weight desc @weight desc");
====================================
#开启去除标签
html_strip = 1
#去除标签的时候留下的信息
html_index_attrs = img=alt,title; a=title;
#完整去除的标签
html_remove_elements = style, script
====================================
增量索引
1.给数据库添加一张表,记录完整索引位置
不管数据是否存在,没有就添加,存在就更新
replace into sp_count(id,max_id) values(1,8);
replace into sp_count(id,max_id) values(1,(select max(id) from post));
2.修改主数据源
#更新最大id
sql_query_pre = replace into sp_count(id,max_id) values(1,(select max(id) from post));
#将当前所有的数据做主索引
sql_query = select id,title,content,weight from post where id <= (select max_id from sp_count where id = 1);
3.添加增量数据源
source postnew : post
{
sql_query_pre = set names utf8
sql_query = select id,title,content,weight from post where id > (select max_id from sp_count where id = 1);
}
4.主索引不变,添加增量索引
index ind_postnew : ind_post
{
source = postnew
path = /usr/local/coreseek/var/data/postnew
}
5.结合操作系统的计划任务即可
每天晚上4:30做主索引,每5分钟做增量索引
30 4 * * * /usr/local/coreseek/bin/indexer ind_post --rotate
*/5 * * * * /usr/local/coreseek/bin/indexer ind_postnew --rotate
====================================
更新词典词条
1.编辑/usr/local/mmseg3/etc/unigram.txt 词典模板文件
2. ../bin/mmseg -u unigram.txt 重新得到词典
3.替换词典 mv unigram.txt.uni uni.lib
4.重新创建索引
具体代码
header("content-type:text/html;charset=utf-8");
//包含类文件
include "./sphinxapi.php";
//接收关键字
$keyword = $_GET["keyword"];
//实例化sphinx对象
$sp = new SphinxClient();
//连接服务器
$sp->setServer("127.0.0.1","9312");
//设置匹配模式
$sp->setMatchMode(SPH_MATCH_ANY);
//执行搜索
$result = $sp->query($keyword,"*");
if($result["total"] == 0) exit("查无数据");
//整理所有id
$ids = join(",",array_keys($result["matches"]));
//连接数据库查数据
$dsn = "mysql:host=localhost;dbname=test";
$pdo = new PDO($dsn,"root","");
$sql = "set names utf8";
$pdo->query($sql);
$sql = "select * from post where id in ({$ids})";
//最终结果
$data = $pdo->query($sql)->fetchAll(2);
$opts = array(
"before_match" => "",
"after_match"=> ""
);
//处理结果
foreach($data as $key=>$val){
$data[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);
}
?>