sphinx 增量索引更新

sphinx 增量索引更新(转的,讲的挺好) 是基于PHP API调用,而不是基于sphinxSE。现在看来sphinxSE比API调用更简单的多,因为之前没有想过sphinxSE,现在先把API的弄明白。 涉及到的:sphinx 数据源的设置,简单shell脚本的编写,以及简单crontab的使用 看了以下一些网页的内容 sphinx增量索引 给sphinx做增量索引更新 Crontab笔记 linux脚本编写 一.sphinx增量索引的设置 数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如。原来的数据有几百万条,而新增的只是几千条。看到的资料是使用“主索引+增量索引”的模式来实现实时更新的功能。 这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们 可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同 时查询这两个索引的数据。 一个简单的实现是,在数据库中增加一个计数表,记录将文档集分为两个部分的文档ID,每次重新构建主索引是,更新这个表。 以默认的sphinx.conf配置为例,数据库表的数据也以 example.sql中的为例。 1.先在mysql中插入一个计数表和两个索引表 1. CREATE TABLE sph_counter( 2. counter_id INTEGER PRIMARY KEY NOT NULL, 3. max_doc_id INTEGER NOT NULL 4. ); 2.修改sphinx.conf 1. source main_src 2. { 3. type = mysql 4. sql_host = localhost 5. sql_user = yourusername 6. sql_pass =yourpassword 7. sql_db = test //你所用的数据库 8. sql_port =3306 //所用端口,默认是3306 9. #下面这两条,我没有用,但是 SET NAMES utf8 好像很重要,我的数据库表默认使用utf8编码,所以不用也没有关系。使用utf8编码才能够正确进行中文的索引和检索。 10. sql_query_pre = SET NAMES utf8 11. sql_query_pre = SET SESSION query_cache_type=OFF 12. #下面的语句是更新sph_counter表中的 max_doc_id。 13. sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents 14. sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, 15. content FROM documents / 16. WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) 17. … //其他可以默认 18. 19. } // 注意:delta_src 中的sql_query_pre的个数需和main_src 对应,否则可能搜索不出相应结果 1. source delta_src: main_src 2. { 3. sql_ranged_throttle = 100 4. sql_query_pre = SET NAMES utf8 5. sql_query_pre = SET SESSION query_cache_type=OFF 6. sql_query_pre = 7. 8. sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, 9. content FROM documents / 10. WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) 11. } 1. index main //主索引 2. { 3. source = main_src 4. path = /path/to/main # example: /usr/local/sphinx/var/data/main 5. …………. 6. charset_type = utf-8 #这个是支持中文必须要设置的 7. chinese_dictionary =/usr/local/sphinx/etc/xdict 8. #……….其它可以默认 9. } //delta可全部复制主索引,然后更改source 和path如下 1. index delta: main //增量索引 2. { 3. source = delta_src 4. path = /path/to/delta # example: /usr/local/sphinx/var/data/delta 5. … 6. } 其它的配置可都用默认的,如果你设置了分布式检索的索引,那么更改下对应的索引名称即可。 3.重新建立索引: 如果sphinx正在运行,那么首先停止运行,然后,根据sphinx.conf配置文件来建立所有索引,最后,启动服务 1. /usr/local/sphinx/bin/searchd –stop 2. /usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf — all 3. /usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf 如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建 delta索引 /usr/local/sphinx/bin/indexer -c /usr/lcoal/sphinx/etc/sphinx.conf delta 查看是否将新的记录进行了索引。如果成功,此时,再用 /usr/local/sphing/bin/search 工具来检索,能够看到,在main索引中检索到的结果为0,而在delta中检索到结果。当然,前提条件是,检索的词,只在后来插入的数据中存在。 接下来的问题是如何让增量索引与主索引合并 4.索引合并 合并两个已有索引 有时比 重新索引所有数据有效,虽然,索引合并时,待合并的两个索引都会被读入内存一次,合并后的内容需写入磁盘一次,即,合并100GB和1GB的两个所以,将导致202GB的IO操作 命令原型: 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 filename 这样才能运行。即 chmod +x build_main_index.sh chmod +x build_delta_index.sh 最后,我们需要脚本能够自动运行,以实现,delta索引每5分钟重新建立,和main索引只在午夜2:30时重新建立。 使用crontab 命令 这有俩个地方可作参考 crontab 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 脚本,输出重定向。 关于前面的 5个值的设置,在上面的crontab文件中有详细的描述。关于重定向的解释,请看最上面的Crontab笔记 ,也有crontab的介绍。 保存好后:重新启动服务 [root@test1 init.d]# service crond stop [root@test1 init.d]# service crond start 或者 /etc/init.d/crontab start 到现在为止,如果脚本写的没有问题,那么build_delta_index.sh将每30分钟运行一次,而build_main_index.sh将在凌晨2:30分才运行。 要验证的话,在脚本中,有将输出重定向到相关的文件,可以查看下文件中的记录是否增多,也可以看下 /usr/local/sphinx/var/log下的 searchd.log 中,每次重建索引都会有记录。 总结 1.在修改sphinx.conf文件中犯了一个很不应该的错误,在数据源delta_src 中,把sql_query 错写成 sql_query_pre 于是,即使有新的数据插入数据库,重新建立delta索引也找不到这个记录,而重新建立main索引却没有问题,这个问题就这样弄了整上午,最后,把 main_src源中的所有文件都拷贝放入delta_src中,并且把继承main_src去掉,把delta_src当成完整的数据源来看待,这时才 提示没有sql_query语句。而之前因为是继承自main_src源,所以即使没有也没有问题。 2.数据源和索引名字的问题,之前根据sphinx中文文档,把源和索引都命名为main 和delta,会出现中文检索不到的问题。开始以为是数据源的编码问题。另外写了一个简单点的配置文件,检索没有问题,也就是配置文件写错了。试着改了下 名字,以及把set_sql_query=utf8注释掉。之后,开始好用。 3.索引合并问题,前面已经解释过,两个索引合并时,都要读入,然后还要写一次硬盘,IO操作量很大。而在php API调用时,Query($query,$index)中$index可以设置多个索引名,如Query($query,”main;delta”), 也就没有必要一定将两个索引合并,或者,合并的次数不用那么多。 4.还有一个是没有尝试过的,把增量索引存放到共享内存中(/dev/shm)以提高索引性能,减少系统负荷。 关于PHP API 如何能够顺利通过PHP页面来进行检索。 首先,在服务器上searchd 必须是运行的。 然后,根据test.php来修改下。 运行,连接时会出现一个很大的问题 errno =13 permission deny. 最后,查到一个英文的网页,是因为SElinux的原因,关于SELinux在网上能搜到。没有很好的解决办法,只能把SELinux设置为不用。使用的 命令有下面两个: setenforce 在 /usr/bin 下 setenforce 1 设置SELinux 成为enforcing模式 setenforce 0 设置SELinux 成为permissive模式 over~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值