是基于PHP API调用,而不是基于sphinxSE。现在看来sphinxSE比API调用更简单的多,因为之前没有想过sphinxSE,现在先把API的弄明白。
涉及到的:sphinx 数据源的设置,简单shell脚本的编写,以及简单crontab的使用

一.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. }

// 注意: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. sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title,
  8. content FROM documents \
  9. WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  10. }
  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. }

其它的配置可都用默认的,如果你设置了分布式检索的索引,那么更改下对应的索引名称即可。

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模式

Sphinx 增量索引更新的更多相关文章

  1. sphinx 增量索引 实现近实时更新

    一.sphinx增量索引的设置   数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条 ...

  2. sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)

    一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万 ...

  3. sphinx增量索引使用

    sphinx在使用过程中如果表的数据量很大,新增加的内容在sphinx索引没有重建之前都是搜索不到的. 这时可以通过建立sphinx增量索引,通过定时更新增量索引,合并主索引的方式,来实现伪实时更新. ...

  4. sphinx增量索引和主索引来实现索引的实时更新

    项目中文章的信息内容因为持续有新增,而文章总量的基数又比较大,所以做搜索的时候,用了主索引+增量索引这种方式来实现索引的实时更新. 实现原理: 1. 新建一张表,记录一下上一次已经创建好索引的最后一条 ...

  5. sphinx增量索引

    首先建立一个计数表,保存数据表的最新记录ID CREATE TABLE `sph_counter` (  `id` int(11) unsigned NOT NULL,  `max_id` int(1 ...

  6. sphinx 增量索引与主索引使用测试

    2013年10月28日 15:01:16 首先对新增的商品建立增量索引,搜索时只使用增量索引: array (size=1) 0 => array (size=6) 'gid' => st ...

  7. sphinx通过增量索引实现近实时更新

    一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...

  8. Coreseek:部门查询和增量索引代替实时索引

    1.行业调查 索引系统需要通过主查询来获取所有的文档信息,一个简单的实现是整个表的数据到内存,但是这可能会导致整个表被锁定,并且使其它操作被阻止(例如:在MyISAM格款式上INSERT操作).同时, ...

  9. Coreseek:区段查询及增量索引取代实时索引

    1.区段查询 索引系统须要通过主查询来获取所有的文档信息,一种简单的实现是将整个表的数据读入内存,可是这可能导致整个表被锁定并使得其它操作被阻止(比如:在MyISAM格式上的INSERT操作),同一时 ...

随机推荐

  1. (转载)Go语言开发环境配置

    一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...

  2. 每天一个linux命令(50):telnet命令

    telnet 命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是 Internet远程登陆服务的标准协议和主要方式.它为 ...

  3. Spring security 学习 (自助者,天助之!)

    自己努力,何必要强颜欢笑的求助别人呢?  手心向下不求人! Spring security学习有进展哦: 哈哈! 1.页面都是动态生产的吧! 2.设置权限:  a:pom.xml配置jar包 b:cr ...

  4. iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误

    控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

  5. 牛客网上的剑指offer题目

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...

  6. 从TP、FP、TN、FN到ROC曲线、miss rate、行人检测评估

    从TP.FP.TN.FN到ROC曲线.miss rate.行人检测评估 想要在行人检测的evaluation阶段要计算miss rate,就要从True Positive Rate讲起:miss ra ...

  7. HOPE——懦怯囚禁人的灵魂,希望可以感受自由。强者自救,圣者渡人。

    人世间最美好的,就是希望 人世间最美好的,就是友谊 祝福所有相信希望的人,因为每个充满希望的人,都如此美丽. <肖申克的救赎>中的经典台词 1.Hope is a good thing,  ...

  8. PHP 数据库驱动、连接数据不同方式学习笔记

    相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.ph ...

  9. DLUTOJ 1331 Maximum Sum

    传送门 Time Limit: 1 Sec  Memory Limit: 128 MB  Description You are given an array of size N and anothe ...

  10. Mac OS下编写对拍程序

    介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...