Sphinx增量索引
来源:互联网 发布:淘宝访问深度怎么算 编辑:程序博客网 时间:2024/05/16 13:05
sphinx创建索引之后,如果我们的数据库又增加了一条数据,需要重新创建索引。但是如果数据量十分庞大时,每次都重新创建索引显然是不合适的。
我们希望实现的效果是,每次都只创建新增的数据的索引。
增量索引实现原理
假设现在数据库中有三条数据,id分别为1,2,3。
使用indexer命令为这三条数据创建索引,并把max_doc_id=3
记录到一张表(sphinx_counter
)中,表示当前主索引已经创建了id<=3
的所有数据的索引
假设此时有新的数据插入,id为4,5。然后为这两条新数据创建索引,称之为增量索引,同时更新sphinx_counter
表,max_doc_id=5
最后使用indexer --merge
将增量索引合并到主索引中
sphinx_counter
表结构如下:
DROP TABLE IF EXISTS `sphinx_counter`;CREATE TABLE `sphinx_counter` ( `counter_id` int(11) NOT NULL COMMENT '标识不同的数据表', `max_doc_id` int(11) NOT NULL COMMENT '文档已索引的最大id', PRIMARY KEY (`counter_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
增量索引配置
#===================数据源配置=================#主索引数据源source article_src { type = mysql sql_host = localhost sql_user = root sql_pass = root sql_db = sphinx sql_port = 3306 # optional, default is 3306 sql_query = SELECT id, content,createtime FROM article WHERE id<=( SELECT max_doc_id FROM sphinx_counter WHERE counter_id=1 ) sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF #创建主索引时,将最大文档id插入到sphinx_counter表中 sql_query_pre = REPLACE INTO sphinx_counter SELECT 1, MAX(id) FROM article }#增量索引数据源source article_delta_src: article_src{ sql_query_pre = SET NAMES utf8 sql_query_range = sql_range_step = 10000 #增量索引只查询新增的数据 sql_query = SELECT * FROM article where id>( SELECT max_doc_id FROM sphinx_counter WHERE counter_id=1 ) # 增量索引创建完成之后,更新最大的doc_id sql_query_post = UPDATE sphinx_counter SET max_doc_id=(SELECT MAX(id) FROM article) where counter_id=1 } #===================索引配置=================#主索引index article_index { source = article_src path = /usr/local/sphinx/var/data/article}#增量索引index article_delta_index : article_index{ source = article_delta_src path = /usr/local/sphinx/var/data/article_delta}indexer{ mem_limit = 128M}searchd{ listen = 9312 listen = 9306:mysql41 log = /usr/local/sphinx/var/log/searchd.log query_log = /usr/local/sphinx/var/log/query.log read_timeout = 5 max_children = 30 pid_file = /usr/local/sphinx/var/log/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = /usr/local/sphinx/var/data}
定时索引任务
我们要写一个增量索引的脚本,定时去执行这个脚本
#!/bin/bash#创建增量索引/usr/local/sphinx/bin/indexer article_delta_index --rotate#合并增量索引和主索引/usr/local/sphinx/bin/indexer --merge article_index article_delta_index --rotate
--rotate
表示通知searchd进程有索引更新了,如果没有这个参数,必须停止searchd进程才能创建索引
一般情况我们也会创建一个主索引脚本,每天半夜无人时去执行一次,来全部重新创建索引
#!/bin/bash/usr/local/sphinx/bin/indexer article_index --rotate
注意
- 如果不合并增量索引和主索引,每次创建增量索引都会覆盖之前创建的增量索引,导致索引丢失
- 合并索引时的IO消耗是索引文件大小的两倍,假设主索引文件大小是100G,增量索引大小是2G,那么IO消耗是
(100+2)*2 = 204G
,虽然IO消耗大,但相比全部重新创建索引来说,还是小得多。
0 0
- Sphinx增量索引(转)
- sphinx 增量索引更新
- sphinx 增量索引更新
- sphinx增量索引
- Sphinx建立增量索引
- sphinx mysql 增量索引
- sphinx mysql 增量索引
- sphinx增量索引
- sphinx 增量索引
- sphinx增量索引
- Sphinx增量索引
- sphinx增量索引
- Sphinx增量索引
- sphinx增量索引配置
- Sphinx增量索引的配置
- sphinx 增量索引实现实例
- SPHINX做增量索引更新
- SPHINX做增量索引更新
- firefox无法安装firebug 的管理员未正确配置网站。为避免您的信息被窃,Firefox 没有建立与该网站的连接。
- Vue.js动画在项目使用的两个示例
- 基于CentOS7的KVM虚拟化安装及应用--基础篇
- 在Android系统源码下编译apk
- MVC模式示例
- Sphinx增量索引
- linux设备驱动之LED驱动代码分析
- Java 集合框架---hashmap
- numpy通用函数:快速的元素级数组函数
- buffer的slice()方法返回的新buffer和原buffer引用的是同一个对象!!!修改千万要注意!
- TortoiseGit 对 github 版本库的管理
- angular-scope依赖关键字注入-解决办法
- 【Unity&NGUI】创建NGUI的Scroll View的一些问题以及拓展
- Leetcode两道小题目python试水