sphinx增量索引的设置
数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如,原来的数据有几百万条,而新增的只是几千条。这样就可以使用“主索引+增量索引”的模式来实现近乎实时更新的功能。
这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率可以设置的长一些(例如设置在每天的午夜进行),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。
使用“主索引+增量索引”方法有个简单的实现,在数据库中增加一个计数表,记录每次重新构建主索引时,被索引表的最后一个数据id,这样在增量索引时只需要索引这个id以后的数据即可,每次重新构建主索引时都更新这个表。
1.先在mysql中插入一个计数表和两个索引
CREATE TABLE `sph_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
2.修改sphinx.conf
source main_src {
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = task //所用的数据库
sql_port = 3306 //所用端口,默认是3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
#下面的语句是更新sph_counter表中的 max_doc_id。
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
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 )
}
//注意:delta_src 中的sql_query_pre的个数需和 main_src 对应
source delta_src: main_src {
sql_ranged_throttle = 100
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
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 )
}
//主索引
index main {
source = main_src
path = /usr/local/sphinx/var/data/main
charset_type = utf-8 #这个是支持中文必须要设置的
chinese_dictionary = /usr/local/sphinx/etc/xdict
}
//增量索引
index delta: main {
source = delta_src
path = /usr/local/sphinx/var/data/delta
}
其它的使用默认配置
3.重新建立索引
$ /usr/local/sphinx/bin/searchd --stop
$ /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all
$ /usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf
$ /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all --rotate (不需要停止searchd,索引后也不再需要重启searchd)
如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建 delta 索引
$ /usr/local/sphinx/bin/indexer -c /usr/lcoal/sphinx/etc/sphinx.conf delta
4.索引合并
命令原型: indexer --merge DSTINDEX SRCINDEX [--rotate]
将SRCINDEX合并到 DSTINDEX, 所以只有DSTINDEX会改变,如果两个索引都正在提供服务,那么 --rotate 参数是必须的。
例如:将delta合并到main中
indexer --merge main delta
5.索引自动更新
建立两个脚本:build_main_index.sh 和 build_delta_index.sh
build_main_index.sh:
#!/bin/sh
#停止正在运行的searchd
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/mersphinx.conf --stop >> /usr/local/sphinx/var/log/sphinx/searchd.log
#建立主索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/mersphinx.conf main >> /usr/local/sphinx/var/log/sphinx/mainindex.log
#启动searchd守护程序
/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log
build_delta_index.sh
#!/bin/sh
#停止sphinx服务,将输出重定向
/usr/local/sphinx/bin/searchd –stop >> /usr/local/sphinx/var/log/sphinx/searchd.log
#重新建立索引delta ,将输出重定向
/usr/local/sphinx/bin/indexer delta –c /usr/local/sphinx/etc/sphinx.conf>>/usr/lcoal/sphinx/var/log/sphinx/deltaindex.log
#将delta合并到main中
/usr/local/sphinx/bin/indexer –merge main delta –c /usr/local/sphinx/etc/sphinx.conf >> /usr/lcoal/sphinx/var/log/sphinx/deltaindex.log
#启动服务
/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log
设置可执行
chmod +x build_main_index.sh
chmod +x build_delta_index.sh
使用crontab 命令设置定时执行
crontab -e 来编辑 crontab 文件
*/30 * * * * /bin/sh /usr/local/sphinx/etc/build_delta_index.sh > /dev/null 2>&1
30 2 * * * /bin/sh /usr/local/sphinx/etc/build_main_index.sh > /dev/null 2>&1
第一条是表示每30分钟运行 /usr/local/sphinx/etc/下的build_delta_index.sh 脚本,输出重定向。
第二条是表示 每天的 凌晨2:30分运行 /usr/local/sphinx/etc下的build_main_inde.sh 脚本,输出重定向。
相关推荐
windows 下 sphinx 增量索引配置文件 mssql
标题中的“sphinx增量索引的一个问题”指的是在使用Sphinx搜索引擎时遇到的关于增量索引功能的问题。Sphinx是一个开源全文搜索引擎,它允许开发者通过API进行集成,以实现高效、精确的全文检索功能。增量索引是...
例如,"sphinx增量索引的一个问题" 可能涉及如何处理数据更新时只影响部分文档的情况,以及如何在不中断服务的情况下完成索引更新的策略。 总之,Sphinx 提供了一套强大的搜索解决方案,通过细致的查询处理和高效的...
建立Sphinx增量索引数据表 在MySQL中创建一个数据表,用于存储Sphinx的增量索引。 ##### 6. 书写常用的sphinx控制命令到sh文件 为了方便管理和维护,可以将常用的Sphinx命令封装到shell脚本中。 ##### 7. 创建...
这通常通过设置SQL增量更新或触发器实现,确保索引始终保持最新。 6. **CoreSeek** CoreSeek是Sphinx的中文版,提供了中文分词支持,适合处理中文数据。`coreseek-3.2.14-win32.zip`可能是CoreSeek的安装包,包含...
Sphinx是一个基于SQL的全文检索引擎,可以结合...Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx是一个基于SQL的全文检索引擎,可以结合...Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx是一个基于SQL的全文检索引擎,可以结合...Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
2、创建Sphinx主索引文件、增量索引文件存放目录 12 3、创建Sphinx配置文件 13 4、初始化sphinx.conf中配置的全部索引 13 5、创建两个shell脚本,一个用来创建主索引、一个用来创建增量索引。 13 ⑴、主索引更新脚本...
Sphinx是一个基于SQL的全文检索引擎,可以结合...Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。 Sphinx的主要特性包括:高速索引 (在新款CPU...
Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。 Sphinx的主要特性包括: 高速索引 (在新款CPU...
Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。 Sphinx的主要特性包括: 高速索引 (在新款...
增量检索是Sphinx的一个重要特性,它允许在数据更新时仅对新数据或更改过的数据进行索引,而不是重新构建整个索引。这对于大型数据库来说非常有效,可以节省时间和资源。在Java中实现增量检索,需要正确配置Sphinx...
3. **实时更新**:使用`mysqlbinlog`工具监听MySQL的binlog日志,实现实时增量索引更新。 4. **全量更新**:定期或在必要时执行全量重建索引的操作。 ### 五、全文检索应用开发 1. **API接口**:选择合适的API接口...
前言:本文阐述的是一款经过生产环境检验的千万...Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟, 创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
为了应对不同的应用场景,Sphinx还提供了诸如增量索引、快照索引等高级特性,这些特性允许在不影响主索引的情况下进行索引操作,从而保证搜索服务的稳定性和可靠性。 总的来说,Sphinx全文检索索引的创建涉及到文档...
同时,它的索引构建速度也非常快,大约5分钟就能处理百万条记录,增量索引的重建只需几十秒,每天的增量索引合并到主索引也只需一分钟左右。这对于高负载的Discuz!站点来说,是解决搜索速度慢、数据库锁表以及无法...