思路,数据每时每刻在增加,然后不可能每次都重新加载索引,如果数据特别大占用cpu和性能。
1.用一个计数器,记住每天这张表最大的ID值,
2.用增量索引,没5分钟增加增量索引,保证sphinx实时能搜索到,减少数据延时性。
3.每天更新主索引
实现方法
先弄个计数器
CREATE TABLE `sph_counter` (
`count_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`max_doc_id` int(11) DEFAULT NULL,
PRIMARY KEY (`count_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#源定义
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = 123456
sql_db = test
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = replace into sph_counter select 1,max(id) from documents
#预先处理计数器表Id
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
where id<=(select max_doc_id from sph_counter where counter_id=1 )
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
#####以下是用来过滤或条件查询的属性,这里列出的字段将可以进行条件查询,同时不参与全文检索############
sql_attr_uint = group_id #从SQL读取到的值必须为整数
sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
#sql_attr_float
#sql_attr_string
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}
#增量数据源
source delta : mysql
{
sql_query_pre=set names utf8
sql_query=SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
where id>(select max_doc_id from sph_counter where count_id = 1)
}
#index定义
index mysql
{
source = mysql #对应的source名称
path = F:/mysql/sphinx/documents/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 1
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = F:/mysql/coreseek-3.2.14-win32/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#增量索引
index delta : mysql
{
source=delta
path = F:/mysql/sphinx/delta/
# path = /usr/local/coreseek/var/data/delta
# morphology = stem_en
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
# compat_sphinxql_magics = 0
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = F:/mysql/coreseek-3.2.14-win32/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = F:/mysql/coreseek-3.2.14-win32/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = F:/mysql/coreseek-3.2.14-win32/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
#binlog_path = #关闭binlog日志
}
注意:在Centos7中PHP7环境中
preopen_indexes
和seamless_rotate
要设置成1 要不在php代码query执行查询多个索引的时候会报错、官方给的例子是只能设置一个Example:
seamless_rotate = 1
sphinx索引文件的打开也有两种模式:
preopen_indexes = 0 or 1
限于sphinx索引滚动的实现方式,sphinx的索引滚动与索引文件的preopen有一些冲突的地方,既preopen_indexes=1 has no effect with seamless_rotate=0
linux下 用即时任务实时更新
第一个主索引msyql脚本
#!/bin/bash
/usr/local/coreseek/bin/inderer mysql --rotate >>/usr/local/coreseek/var/log/mysql.log
第二个增量索引delta脚本
#!/bin/bash
/usr/local/coreseek/bin/inderer delta --rotate >>/usr/local/coreseek/var/log/delta.log
即时任务crontab -e 然后将这两个脚本放在linux定时任务器每5分钟执行一次增量索引,每天3天执行以下主索引
*/5 * * * * /usr/local/coreseek/init/delta.sh
00 03 * * * /usr/local/coreseek/init/main.sh
分布式索引的配置
index dist{
type=distributed
local =chunk1
agent =localhost:9312:chunk2
#本地:的9312端口的:chunk2 数据源(source)
agent =192.168.100.2:9312:chunk3 #远程索引
agent =192.168.100.3:9312:chunk4 #远程索引
}