coreeek 和 sphinx 的配置与使用
2016-06-26 16:58
260 查看
前言
关于sphinx的安装请参考Sphinx安装记录.
关于coreeek的安装请参考
coreseek安装记录.
sphinx和coreeek安装好后,是可以搜索出满意的结果了,凡是有一个问题:对于新增的数据,我们需要在sphinx中重建索引。
又由于旧的数据量是很大的,所以重建索引是很费时间的,所有如果数据不需要实时同步,那么每天晚上定时重建一下就行了。
如果需要实时同步,比如几分钟内就要搜索生效,那么就需要使用增量索引了。
然后再在晚上闲时合并增量索引和主索引。
关于配置
在sphinx中,需要配置两个数据源和两个索引,一个是主索引,另一个是增量索引,而且增量索引需要继承于主索引。由于我们的索引会在指定时间合并,所以在下次合并索引之前,我们增量索引需要做的就是重建上次合并索引之后改变或新增的数据。
所有我们需要一个辅助表来记录上次修改的时间,用于增量索引使用。
辅助表结构很简单,只有一个字段上次合并的时间,而且永远只有一条记录。
CREATETABLEt_blog_time_sphinx
(
c_idINTEGERPRIMARYKEYNOTNULL,
c_timeDATETIMENOTNULL
);
关于sphinx的配置如下
#主数据源
sourcemain_source
{
type=mysql
sql_host=127.0.0.1
sql_user=test
sql_pass=test
sql_db=test
sql_port=3306
sql_query_pre=SETNAMESutf8
sql_query=selectc_id,c_title,c_content,c_year,c_month,c_day,c_modifytime,c_createtimeFROMt_blog_sphinx;
sql_attr_uint=c_year
sql_attr_uint=c_month
sql_attr_uint=c_day
sql_attr_timestamp=c_modifytime
sql_attr_timestamp=c_createtime
sql_field_string=c_title
sql_field_string=c_content
}
#增量数据源
sourcemain_inc_source:main_source
{
sql_query_pre=SETNAMESutf8
sql_query=selectc_id,c_title,c_content,c_year,c_month,c_day,c_modifytime,c_createtimeFROMt_blog_sphinxwherec_modifytime>(SELECTc_timeFROMt_blog_time_sphinxlimit1);
}
#主索引
indexmain_index
{
source=main_source
path=/usr/local/coreseek4/var/data/main_index
docinfo=extern
charset_type=zh_cn.utf-8
charset_dictpath=/usr/local/mmseg3/etc/
ngram_len=0
}
#增量索引
indexmain_inc_index:main_index
{
source=main_inc_source
path=/usr/local/coreseek4/var/data/main_inc_index
}
#索引程序
indexer
{
mem_limit=32M
}
#守护程序
searchd
{
listen=9312
listen=9306:mysql41
log=/usr/local/coreseek4/var/log/searchd.log
query_log=/usr/local/coreseek4/var/log/query.lo
client_timeout=300
read_timeout=5
max_children=30
pid_file=/usr/local/coreseek4/var/log/searchd.pid
max_matches=1000
seamless_rotate=1
preopen_indexes=1
unlink_old=1
mva_updates_pool=1M
max_packet_size=8M
max_filters=256
max_filter_values=4096
max_batch_queries=32
workers=threads#forRTtowork
}
启动sphinx
第一步是辅助表中插入一个时间INSERTINTOt_blog_time_sphinx(c_time)VALUES(now());
第二步是创建主索引和增量索引
/usr/local/coreseek4/bin/indexermain_index
/usr/local/coreseek4/bin/indexermain_inc_index
第三部是启动守护程序
/usr/local/coreseek4/bin/searchd
定时任务
定时任务需要做的有这么几件事。实时重建当天的索引(增量索引)
晚上合并增量索引到主索引
更新辅助表的时间为当前时间(一般减去若干分钟,来使数据有几分钟的冗余,避免遗漏数据)
#增量索引
/usr/local/coreseek4/bin/indexert_cover_sphinx_inc_index--rotate
#合并
/usr/local/coreseek4/bin/indexer--merget_cover_sphinx_indext_cover_sphinx_inc_index--rotate
#修改辅助表上次的合并时间
updatet_blog_time_sphinxsetc_time=now()-10*60;
php测试程序
在coreseek的测试目录下可以找到sphinxapi.php文件,复制到你的php源代码对应的位置。关于全文索引字段的组装格式,可以参考
官方文档
//加入sphinxapi
include('api/coreseek_sphinxapi.php');
//初始化sphinx
$sphinx=newSphinxClient();
$sphinx->setServer($ip,$port);
//设置属性字段
if(isset($_GET["year"])&&strlen($_GET["year"])>0){
$sphinx->SetFilter("c_year",array($_GET["year"]));
}
//设置全文检索字段
$query="";
if(isset($_GET["title"])&&strlen($_GET["title"])>0){
$query.="|".trim($_GET["title"]);
}
if(isset($_GET["content"])&&strlen($_GET["content"])>0){
$query.="|".trim($_GET["content"]);
}
$query=trim($query);
//开始搜索,索引必须是主索引和增量索引
$res=$sphinx->query($query,'main_inc_index,main_index');
echo"<p>query=$query</p>";
//输出结果,其中GetLastError和GetLastWarning用于调试。
echo"<pre>";
print_r($sphinx->GetLastError());
print_r($sphinx->GetLastWarning());
print_r($res);
echo"</pre>";
相关文章推荐
- Socket编程
- Chapter 1. WinForm 概述(属性、事件、控件)
- NavigationView使用时遇到的问题
- 原始套接字编程(1)
- 长逻辑运算符和短逻辑运算符
- 3. ioctl
- 软件开发者如何准备未来?
- javascript异步编程
- MongoDB学习整理
- c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
- CentOS添加新硬盘到新的分区(xfs/ext4) 或者添加新分区
- Data and Times
- 微信sdk的用法
- mongodb工具类
- 安卓手机屏幕同步工具asm.jar
- sphinx 源码阅读之数据结构与算法
- 【DAY1】Linux的安装和基本命令学习笔记
- 让数据帧告诉你生成树的选举原则
- Java学习笔记之深入理解动态绑定和静态绑定
- SQLHelper类方法介绍及简单使用