sphinx实时更新
Posted -Eric-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sphinx实时更新相关的知识,希望对你有一定的参考价值。
1 创建一个表【保存已经创建好的商品的最大ID】-》能够根据这个ID找出哪些商品还没创建索引
每次创建好索引之后把最大的ID存进去,定期取出新的商品创建索引,创建完新的索引之后再把最大的ID更新到这个表
/************sphinx表***********/
drop table if exists p40_sphinx_id;
create table p40__sphinx_id
(
id mediumint unsigned not null default ‘0‘ comment ‘已经建好索引的最后一件商品的ID‘
)engine=InnoDB default charset=utf8 comment ‘sphinx‘;
insert into p40_sphinx_id values(0);
2 修改sphinx的配置文件
2.1 创建好索引之后把已经建好的最后的商品ID更新到这个表
#mysql数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#为数据库中的表p40_goods表 为数据源
#源定义
source goods
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = php40
sql_port = 3306
sql_query_pre = SET NAMES utf8
#主查询:要为哪些数据建索引就使用一条SQL语句把这些数据取出来即可
#要求:第一个字段一定是ID
#现在这个SQL的意思是让SPHINX为所有商品的:goods_name,goods_decs,attr_value这三个字段创建全文索引
sql_query = SELECT a.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value) attr_value from p40_goods a LEFT JOIN p40_goods_attr b ON a.id=b.goods_id GROUP BY a.id
#在创建好索引之后把最后一个商品ID更新到这个表
sql_query_post =UODATE P40_sphinx_id set id=(select max(id) from p30_goods where is_on_sale=‘是‘)
}
建好之后就把ID更新到表中了
3 修改配置文件后添加的还没有创建索引的数据生成一个增量索引
#后添加的还没有索引的数据 的数据源
source goods_new
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = php40
sql_port = 3306
sql_query_pre = SET NAMES utf8
#主查询:要为哪些数据建索引就使用一条SQL语句把这些数据取出来即可
#要求:第一个字段一定是ID
#取出后添加的还没有索引的数据
sql_query = SELECT a.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value) attr_value from p40_goods a LEFT JOIN p40_goods_attr b ON a.id=b.goods_id where a.is_on_sale=‘是‘ AND a.id > (select id from p40_sphinx_id)GROUP BY a.id
#在创建好索引之后把最后一个商品ID更新到这个表
sql_query_post =UODATE P40_sphinx_id set id=(select max(id) from p30_goods where is_on_sale=‘是‘)
}
index goods_new
{
source = goods_new #对应的source名称
#生成的索引文件存放的目录
path = D:\server\apache\htdocs\tp\tp40\coreseek-3.2.14-win32\var\data\goods_new
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#一个数据源对应一个index
#定义索引文件
index goods
{
source = goods #对应的source名称
#生成的索引文件存放的目录
path = D:\server\apache\htdocs\tp\tp40\coreseek-3.2.14-win32\var\data\goods
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
4 写一个脚本,
a 先为增量数据生成索引文件
b 把 新生成的增量 的索引文件合并到主索引文件
说明:windows:bat脚本 *.bat
Linux: shell脚本 只有有可执行的权限就可以执行【chmod+x 文件名】
在 根目录创建文件 以.bat结尾
C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\bin\indexer.exe -c C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\sphinx.conf goods_del --rotate
C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\bin\indexer.exe -c C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\sphinx.conf --merge goods goods_del --merge-dst-range is_updated 0 0 --rotate
C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\bin\indexer.exe -c C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\sphinx.conf goods_new --rotate
C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\bin\indexer.exe -c C:\Users\wyl\Documents\cz\sphinx\coreseek-3.2.14-win32\sphinx.conf --merge goods goods_new --rotate
配置脚本每隔5分钟自动执行一次
说明:windows:管理工具->任务计划
控制面板-》管理工具-》任务计划程序-》点击右侧 -创建基本任务-》填写基本任务名称(自动更新sphinx)-》描述(每隔5分钟自动更新)-》下一步(每天)-》启动程序-》填写任务文件地址-》完成
linux:crond 进程
以上是关于sphinx实时更新的主要内容,如果未能解决你的问题,请参考以下文章
整理Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)